Căutare text
Modul text al Greph caută octeți, linie cu linie, într-un arbore de fișiere parcurs. Este modul implicit pentru greph CLI și fațada Greph::searchText(). Rezultatele folosesc formatul canonic file:line:content, interpretat de grep, ripgrep și de majoritatea integrărilor pentru editor.
Exemple rapide
# 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
Modele
În mod implicit, tiparul este tratat ca o expresie regulată PCRE2. Funcțiile preg_* ale PHP stau la baza motorului, astfel că sintaxa corespunde referinței PCRE PHP.
Dezactivați motorul de expresii regulate cu -F pentru a trata tiparul ca pe o secvență literală de octeți. Modul cu șir fix este calea rapidă: folosește strpos() pentru potrivire și omite complet etapa de compilare PCRE2.
-i face ambele moduri insensibile la majuscule și minuscule. -w adaugă limite de cuvânt întreg de ambele părți ale potrivirii.
Filtrarea fișierelor
Greph parcurge arborele de fișiere înainte de căutare. Walker-ul este comun cu modul AST și modul indexat, așa că aceleași opțiuni de filtrare se aplică peste tot.
| Opțiune | Efect |
|---|---|
--type NAME |
Include numai fișierele care corespund aliasului de tip specificat (php, js, md, ...) |
--type-not NAME |
Exclude fișierele care corespund aliasului de tip specificat |
--glob GLOB |
Include numai fișierele ale căror căi corespund cu GLOB. Poate fi repetată. |
--no-ignore |
Nu respectă .gitignore sau .grephignore |
--hidden |
Include fișierele ascunse |
În mod implicit, walker-ul respectă .gitignore și .grephignore, omite fișierele binare (detectate prin octeți nuli în primii 512 octeți) și limitează dimensiunea fișierelor la 10 MiB. Ambele limite pot fi configurate prin WalkOptions.
Consultați API / Filtru pentru tipuri de fișiere pentru lista completă a aliasurilor de tip incluse.
Context, numărători și moduri doar pentru fișiere
# 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
-c, -l și -L opresc formatarea înainte de a crea toate liniile. Acestea sunt modurile potrivite pentru întrebări de tipul „câte?” și „unde?”.
Scanări paralele
Transmiteți -j N pentru a distribui scanarea între N lucrători. Greph folosește pcntl_fork() pentru grupul de lucrători și revine la execuția într-un singur proces când ext-pcntl nu este disponibil.
./vendor/bin/greph -F -j 8 "function" src
Fațada calculează dacă execuția paralelă merită costul suplimentar, în funcție de numărul de fișiere, mod și forma tiparului. Sub prag, rămâne la un singur proces. Consultați Avansat / Lucrători paraleli pentru euristici.
Ieșire JSON
--json emite un conținut structurat pe care instrumentele din aval îl pot interpreta fără să extragă informații din formatul grep:
./vendor/bin/greph --json -F "function" src
[
{
"file": "src/Greph.php",
"matches": [
{
"line": 31,
"column": 1,
"content": "final class Greph",
"matched_text": "function",
"captures": []
}
]
}
]
Wrapper-ul rg emite în schimb ripgrep în formatul JSON cu evenimente. Folosiți-l când un consumator existent așteaptă schema ripgrep.
Utilizare programatică
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";
}
}
Obiectele rezultat sunt documentate în API / Obiecte rezultat.
Cum funcționează
Motorul text are două căi:
- Calea literală: când este setat
-F, căutarea ruleazăstrpos()folosind un cititor cu buffer de 64 KiB și urmărește caracterele de linie nouă pentru numerotarea liniilor. Nu există etapă de compilare a expresiei regulate. - Calea cu expresii regulate: când
-Fnu este setat, Greph extrage subșiruri literale din tipar folosind un analizor mic în stil PCRE (Greph\Text\LiteralExtractor) și le folosește ca prefiltrustrpos(). Liniile care trec de prefiltru sunt apoi comparate cu tiparul PCRE2 compilat, cu JIT activat.
Ambele căi folosesc același BufferedReader pentru I/O. Cititorul citește în blocuri de 64 KiB, nu fgets() pentru fiecare linie, ceea ce reduce considerabil numărul apelurilor de sistem pentru fișiere mari.
Pentru sarcini repetate, modul text indexat înlocuiește cititorul cu buffer cu un depozit de postări trigramă și identificator încălzit și omite complet majoritatea fișierelor.