Ugrás a tartalomhoz

Szövegkeresés

A Greph szöveges módja soronkénti, bájtalapú keresést végez egy bejárt fában. Ez a greph CLI és a Greph::searchText() homlokzat alapértelmezett módja. A kimenet a kanonikus file:line:content formátumot használja, amelyet a grep, a ripgrep és a legtöbb szerkesztőintegráció fel tud dolgozni.

Gyors példák

Shell
# Regex search across the current directory
./vendor/bin/greph "function\s+\w+"

# Fixed-string search across src/
./vendor/bin/greph -F "function" src

# Case-insensitive whole-word search
./vendor/bin/greph -F -i -w "function" src

# Two lines of context around each match
./vendor/bin/greph -F -C 2 "TODO" src

# Stop after the first three matches per file
./vendor/bin/greph -F -m 3 "TODO" src

# Files that contain the pattern
./vendor/bin/greph -F -l "TODO" src

# Files that do not contain the pattern
./vendor/bin/greph -F -L "TODO" src

# Count matches per file
./vendor/bin/greph -F -c "TODO" src

# Inverted match
./vendor/bin/greph -F -v "TODO" src/notes.txt

Minták

Alapértelmezés szerint a mintát PCRE2 reguláris kifejezésként értelmezi. A motor működését a PHP preg_* függvényei biztosítják, ezért a szintaxis megfelel a PHP PCRE-referenciának.

Kapcsolja ki a reguláriskifejezés-motort a -F kapcsolóval, hogy a mintát literális bájtsorozatként kezelje. A rögzített karakterláncos mód a gyors út: a strpos() eszközt használja az egyezések kereséséhez, és teljesen kihagyja a PCRE2 fordítási lépését.

A -i mindkét módot kis- és nagybetűkre érzéketlenné teszi. A -w az egyezés két oldalán egészszó-határokat ad meg.

Fájlok szűrése

A Greph végigjárja a fákat keresés előtt. A bejáró közös az AST-móddal és az indexelt móddal, így ugyanazok a szűrőjelzők mindenhol érvényesek.

Jelző Hatás
--type NAME Csak a megadott típusálnévnek megfelelő fájlokat veszi fel (php, js, md, ...)
--type-not NAME Kizárja a megadott típusálnévnek megfelelő fájlokat
--glob GLOB Csak a GLOB mintának megfelelő elérési útú fájlokat veszi fel. Többször is megadható.
--no-ignore Figyelmen kívül hagyja a .gitignore és a .grephignore szabályait
--hidden Rejtett fájlokat is felvesz

A bejáró alapértelmezés szerint figyelembe veszi a .gitignore és a .grephignore beállításait, kihagyja a bináris fájlokat (az első 512 bájtban található nullbájtok alapján felismerve), és 10 MiB-ban korlátozza a fájlméretet. Mindkét korlát a WalkOptions segítségével állítható be.

A beépített típusálnevek teljes listáját lásd a API / FileTypeFilter oldalon.

Kontextus, darabszámok és csak fájlokat felsoroló módok

Shell
# Two lines before and after each match
./vendor/bin/greph -F -C 2 "needle" src

# Two lines after, no lines before
./vendor/bin/greph -F -A 2 "needle" src

# Two lines before, no lines after
./vendor/bin/greph -F -B 2 "needle" src

# Count matches per file
./vendor/bin/greph -F -c "needle" src

# List matching files only
./vendor/bin/greph -F -l "needle" src

# List non-matching files only
./vendor/bin/greph -F -L "needle" src

A -c, a -l és a -L megkerüli a formázót, így nem kell minden sort memóriába töltenie. Ezek a megfelelő módok a „hány” és „hol” típusú lekérdezésekhez.

Párhuzamos keresések

Adja meg a -j N kapcsolót, hogy a keresés N munkafolyamatra legyen szétosztva. A Greph a pcntl_fork() eszközt használja a munkafolyamat-készlethez, és egyetlen folyamatban történő végrehajtásra vált, ha a ext-pcntl nem érhető el.

Shell
./vendor/bin/greph -F -j 8 "function" src

A homlokzat a fájlok száma, az üzemmód és a minta alakja alapján számítja ki, hogy megéri-e a párhuzamos végrehajtás többletterhe. A küszöb alatt egyetlen folyamatot használ. A heurisztikákat lásd a Speciális / Párhuzamos munkafolyamatok oldalon.

JSON kimenet

A --json strukturált adatot bocsát ki, amelyet a további eszközök a grep formátum képernyőről történő kinyerése nélkül is feldolgozhatnak:

Shell
./vendor/bin/greph --json -F "function" src
JSON
[
  {
    "file": "src/Greph.php",
    "matches": [
      {
        "line": 31,
        "column": 1,
        "content": "final class Greph",
        "matched_text": "function",
        "captures": []
      }
    ]
  }
]

A rg burkoló ehelyett ripgrep-esemény alakú JSON adatot bocsát ki. Akkor használja, ha egy meglévő fogyasztó a ripgrep sémát várja.

Programozott használat

PHP
use Greph\Greph;
use Greph\Text\TextSearchOptions;

$results = Greph::searchText(
    'function',
    'src',
    new TextSearchOptions(
        fixedString: true,
        caseInsensitive: true,
        beforeContext: 1,
        afterContext: 1,
        jobs: 4,
    ),
);

foreach ($results as $file) {
    foreach ($file->matches as $match) {
        echo "{$file->file}:{$match->line}:{$match->content}\n";
    }
}

Az eredményobjektumok leírását lásd az API / Eredményobjektumok oldalon.

Működés

A szöveges motornak két útvonala van:

  • Literális útvonal: ha be van állítva a -F, a keresés a strpos() segítségével, egy 64 KiB-os pufferelt olvasón fut, és a sorszámozáshoz nyomon követi az újsorokat. Nincs reguláriskifejezés-fordítási lépés.
  • Reguláriskifejezés-útvonal: ha nincs beállítva a -F, a Greph egy kis, PCRE-szerű elemző (Greph\Text\LiteralExtractor) segítségével literális részkarakterláncokat nyer ki a mintából, majd ezeket strpos() előszűrőként használja. Az előszűrőn átjutó sorokat ezután a JIT-fordítást használó, lefordított PCRE2-mintával veti össze.

Mindkét útvonal ugyanazt a BufferedReader eszközt használja a beolvasáshoz. Az olvasó soronkénti fgets() helyett 64 KiB-os darabokban olvas, ami nagy fájlok esetén jelentősen csökkenti a rendszerhívások számát.

Ismétlődő feladatoknál az indexelt szöveges mód a pufferelt olvasót bemelegített trigram- és azonosító-előfordulásokat tároló tárra cseréli, és teljes egészében kihagyja a fájlok többségét.