Greph
Căutare de cod pură în PHP, căutare structurală și motor de rescriere. Fluxuri de lucru grep, ripgrep și ast-grep într-un singur pachet Composer.
composer require greph/grephCea mai recentă versiune v0.2.3 MIT PHP 8.2+
# Any method call with any arguments
vendor/bin/greph -p '$obj->$method($$$ARGS)' src
# Any function declaration with a void return type
vendor/bin/greph -p 'function $name($$$PARAMS): void {}' src
# Old-style array calls
vendor/bin/greph -p 'array($$$ITEMS)' srcÎn practică
Instalați pachetul cu Composer, apoi căutați și rescrieți din linia de comandă sau din PHP.
Căutați, potriviți și previzualizați o rescriere
-F efectuează o căutare text cu șir fix, -p acceptă un tipar în stil PHP cu metavariabile precum $CLASS, iar -r adaugă un șablon de înlocuire. --dry-run afișează fișierele rescrise fără să le scrie pe disc.
Fațada statică Greph expune aceleași operațiuni pentru codul PHP. Când sunt instalate ca dependență, comenzile vendor/bin necesită versiunea 0.2.3 sau o versiune ulterioară.
# Text search
vendor/bin/greph -F "function" src
# Structural search
vendor/bin/greph -p 'new $CLASS()' src
# Structural rewrite preview
vendor/bin/greph -p 'array($$$ITEMS)' -r '[$$$ITEMS]' --dry-run srcuse Greph\Greph;
use Greph\Ast\AstSearchOptions;
use Greph\Text\TextSearchOptions;
$matches = Greph::searchText(
'function',
'src',
new TextSearchOptions(fixedString: true),
);
$asts = Greph::searchAst(
'new $CLASS()',
'src',
new AstSearchOptions(),
);Pur PHP
Căutarea și rescrierea rulează în PHP 8.2+, fără binarul grep, ripgrep sau ast-grep. Folosește extensiile json, ctype și tokenizer, plus zlib pentru depozitul AST din cache.
Căutare text
Căutare cu șiruri fixe și expresii regulate, cu moduri pentru cuvinte întregi, ignorarea diferențelor dintre majuscule și minuscule, context, numărare și doar fișiere. Rezultate compatibile cu grep.
Căutare AST
Căutare structurală în cod sursă PHP cu $VAR și metavariabile $$$VARIADIC, capturi repetate și rezultate JSON. Este acceptat numai limbajul PHP.
Rescriere AST
Rescrieri structurale cu moduri de simulare, interactiv și scriere. Se modifică numai codul potrivit; comentariile și structura din afara potrivirii rămân neschimbate.
Moduri indexate
Creați o dată un index de text cu trigramă, un index de fapte AST sau un depozit AST în cache și reutilizați-l. În testul de performanță al proiectului, indexul de fapte AST a fost creat în 1.4 s și a redus new $CLASS() de la 2.9 s la 11 ms; indexul cu trigramă a durat 12.3 s.
Wrapper-e rg și sg
vendor/bin/rg și vendor/bin/sg acceptă opțiunile obișnuite de căutare ripgrep și ast-grep în același motor. Nu sunt acoperite: multiline, --replace, --type-add și --sort în rg; regulile YAML și limbajele care nu sunt PHP în sg.
PHP API
Greph::searchText(), searchAst() și rewriteAst() returnează obiecte rezultat tipizate, astfel încât codul PHP și agenții pot apela motorul fără un proces secundar.
Corpus de referință
39 de scenarii compară rezultatele text, AST și rescriere ale greph cu grep, ripgrep și ast-grep. Rulați-le cu composer test:oracle într-o clonă a depozitului; CI rulează suitele de unități și de integrare.
De ce Greph
Fără binare native
Căutarea și rescrierea rulează în procesul PHP. Binar-ele rg, grep și sg sunt folosite doar pentru comparațiile opționale de performanță.
Un singur motor pentru fiecare mod
Căutarea text, căutarea structurală PHP și rescrierea sunt într-un singur pachet Composer. Wrapper-ele rg și sg apelează același motor ca vendor/bin/greph.
Rescrierile ating numai potrivirile
Motorul de rescriere inserează șablonul redat în intervalele de octeți potrivite. Codul din afara unei potriviri își păstrează indentarea, comentariile și liniile goale.
Indexuri încălzite fără serviciu de fundal
Indexurile sunt pe disc și se reutilizează între rulări. Un profil al ciclului de viață decide dacă un index învechit este lăsat neschimbat, reîmprospătat în timpul căutării sau refuzat.
Comparativ cu
Greph păstrează căutarea și rescrierea în PHP. Aceste instrumente rezolvă probleme înrudite și fac unele lucruri pe care Greph nu le face.
| Instrument | Potrivit pentru | Diferența față de Greph |
|---|---|---|
| ripgrep | Potrivit pentruInstrument de căutare recursivă cu expresii regulate, cu suport de prim rang pentru Windows, macOS și Linux și descărcări binare pentru fiecare versiune. Respectă regulile gitignore și omite implicit fișierele ascunse și binare. | Diferența față de GrephGreph se instalează cu Composer și rulează în PHP. În testul său CI de performanță pe corpusul WordPress, rg a fost mai rapid la fiecare interogare text rece, de exemplu 81.62 ms față de 458.82 ms pentru o căutare literală. Un index Greph încălzit a răspuns la o interogare de numărare în 10.90 ms față de 49.61 ms pentru rg. |
| ast-grep | Potrivit pentruUn CLI compilat pentru căutare structurală, lint și rescriere, bazat pe tree-sitter. Are suport integrat pentru multe limbaje, inclusiv PHP, și fișiere de reguli YAML pentru reguli de lint și modificări de cod. | Diferența față de GrephGreph gestionează numai PHP și nu citește reguli YAML. La o scanare rece, sg a fost mai rapid pentru array($$$ITEMS) în testul CI de performanță al Greph. Indexul AST încălzit al Greph a răspuns la new $CLASS() în 10.89 ms față de 4093.61 ms pentru sg. |
| Rector | Potrivit pentruActualizează și refactorizează codul PHP prin reguli și seturi de reguli, acoperind versiunile PHP de la 5.3 la 8.5 și proiecte precum Symfony, PHPUnit și Doctrine. | Diferența față de GrephGreph rescrie pe baza unui tipar și a unui șablon scris de dumneavoastră. Documentația sa exclude acest instrument când modificarea depinde de informații despre tipuri pe care PHP-Parser nu le poate determina dintr-un singur fișier sau când trebuie adăugate ori eliminate importuri din mai multe fișiere. |
| PHP CS Fixer | Potrivit pentruCorectează codul pentru a respecta standardele de codare, cu seturi de reguli integrate precum stilul de codare PER al PHP-FIG. | Diferența față de GrephGreph nu reformatează fișierele. Modifică doar codul potrivit de un tipar, iar documentația indică PHP CS Fixer când aveți nevoie de un formatter. |
Întrebări și răspunsuri
Răspunsuri scurte din documentația Greph.
Nu. Greph efectuează căutarea și rescrierea în PHP. Binar-ele externe rg, grep și sg sunt folosite doar pentru comparațiile opționale de performanță.
Numai PHP. Tiparele și fișierele sursă sunt analizate cu nikic/php-parser, iar orice altă valoare --lang este respinsă ca neacceptată.
Nu la scanările reci. În testul CI de performanță al proiectului pe corpusul WordPress, rg și grep au fost mai rapide la fiecare interogare text rece. Indexurile încălzite ajută la interogări repetate, de exemplu 10.90 ms față de 49.61 ms pentru rg la o numărare indexată.
Greph rulează într-un singur proces. Fără pcntl_fork, grupul de lucrători rulează fiecare fragment în procesul curent, cu același rezultat ca -j 1, și nu generează nicio eroare.
Nu în afara unei potriviri. Codul din afara intervalelor de octeți potrivite își păstrează spațiile albe, comentariile și structura. Codul potrivit este reprodus din șablon, astfel că întreruperile de linie sunt normalizate, iar un comentariu din interiorul lui se poate pierde. Rulați mai întâi cu --dry-run pentru a afișa fișierele rescrise fără să le scrieți pe disc.
În mod implicit, în .greph-index, .greph-ast-index și .greph-ast-cache, la rădăcina indexată. Transmiteți --index-dir oricărei subcomenzi greph-index pentru a folosi o altă locație.
Citiți documentația Greph pentru referința CLI, PHP API, modurile indexate și wrapper-ele rg și sg.