Greph
Reine PHP-Codesuche, Struktursuche und Rewrite-Engine. grep-, ripgrep- und ast-grep-Arbeitsabläufe in einem Composer-Paket.
composer require greph/grephNeueste Version 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)' srcIn der Praxis
Installiere das Paket mit Composer und suche und schreibe anschließend über die Befehlszeile oder aus PHP um.
Suchen, abgleichen und Rewrite in der Vorschau ansehen
-F führt eine Textsuche mit festen Zeichenfolgen aus, -p verarbeitet ein Muster im Format von PHP mit Metavariablen wie $CLASS, und -r ergänzt eine Ersetzungsvorlage. --dry-run gibt die umgeschriebenen Dateien aus, ohne sie zu speichern.
Die statische Greph-Fassade stellt dieselben Funktionen für PHP-Code bereit. Als Abhängigkeit installiert, benötigen die Befehle vendor/bin Version 0.2.3 oder höher.
# 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(),
);Reines PHP
Suche und Rewrite laufen mit PHP 8.2+ ganz ohne grep-, ripgrep- oder ast-grep-Binärdateien. Benötigt die Erweiterungen json, ctype und tokenizer sowie zlib für den zwischengespeicherten AST-Speicher.
Textsuche
Suche mit festen Zeichenfolgen und regulären Ausdrücken, einschließlich Wortgrenzen, Ignorieren der Groß- und Kleinschreibung, Kontext-, Trefferzählungs- und Nur-Datei-Modi. grep-kompatible Ausgabe.
AST-Suche
Strukturelle Suche in PHP-Quellcode mit $VAR- und $$$VARIADIC-Metavariablen, wiederholten Erfassungen und JSON-Ausgabe. Nur PHP wird unterstützt.
AST-Umschreibung
Strukturelle Umschreibungen mit Testlauf-, interaktivem und Schreibmodus. Geändert wird nur passender Code; Kommentare und Layout außerhalb eines Treffers bleiben unverändert.
Indexierte Modi
Erstelle einmalig einen Trigramm-Textindex, einen AST-Faktenindex oder einen gecachten AST-Speicher und verwende ihn erneut. Im Projektbenchmark dauerte der Aufbau des AST-Faktenindex 1,4 s und verkürzte new $CLASS() von 2,9 s auf 11 ms; der Trigrammindex benötigte 12,3 s.
rg- und sg-Wrapper
vendor/bin/rg und vendor/bin/sg akzeptieren die gängigen Suchoptionen von ripgrep und ast-grep und verwenden dieselbe Engine. Nicht abgedeckt: Mehrzeiligkeit, --replace, --type-add und --sort in rg; YAML-Regeln und Nicht-PHP-Sprachen in sg.
PHP API
Greph::searchText(), searchAst() und rewriteAst() geben typisierte Ergebnisobjekte zurück, sodass PHP-Code und Agents die Engine ohne Unterprozess aufrufen können.
Referenzkorpus
39 Szenarien vergleichen die Text-, AST- und Rewrite-Ausgabe von greph mit grep, ripgrep und ast-grep. Führe sie mit composer test:oracle in einem Klon des Repositorys aus; CI führt die Unit- und Integrationstests aus.
Warum Greph
Keine nativen Binärdateien
Suche und Rewrite laufen innerhalb des PHP-Prozesses. Die Binärdateien rg, grep und sg werden nur für optionale Benchmark-Vergleiche verwendet.
Eine Engine für alle Modi
Textsuche, strukturelle PHP-Suche und Rewrite stecken in einem Composer-Paket. Die Wrapper rg und sg rufen dieselbe Engine wie vendor/bin/greph auf.
Umschreibungen betreffen nur Treffer
Die Rewrite-Engine fügt die gerenderte Vorlage in die Bytebereiche der Treffer ein. Code außerhalb eines Treffers behält Einrückung, Kommentare und Leerzeilen bei.
Aufgewärmte Indizes ohne Daemon
Indizes liegen auf der Festplatte und werden bei weiteren Ausführungen wiederverwendet. Ein Lebenszyklusprofil legt fest, ob ein veralteter Index unverändert bleibt, während der Suche aktualisiert oder abgelehnt wird.
Im Vergleich zu
Greph bündelt Suche und Rewrite in PHP. Diese Werkzeuge lösen ähnliche Probleme, und manches kann Greph nicht.
| Werkzeug | Gut geeignet für | Unterschiede zu Greph |
|---|---|---|
| ripgrep | Gut geeignet fürEin rekursives Suchwerkzeug für reguläre Ausdrücke mit erstklassiger Unterstützung für Windows, macOS und Linux sowie Binärdownloads für jede Veröffentlichung. Es beachtet gitignore-Regeln und überspringt standardmäßig versteckte Dateien und Binärdateien. | Unterschiede zu GrephGreph wird mit Composer installiert und läuft in PHP. Im CI-Benchmark für das WordPress-Korpus war rg bei jeder kalten Textabfrage schneller, etwa mit 81,62 ms gegenüber 458,82 ms bei einer Suche nach einem festen Text. Ein aufgewärmter Greph-Index beantwortete eine Zählabfrage in 10,90 ms gegenüber 49,61 ms bei rg. |
| ast-grep | Gut geeignet fürEin kompiliertes CLI für strukturelle Suche, Linting und Rewrite auf Basis von tree-sitter. Es unterstützt zahlreiche Sprachen von Haus aus, darunter PHP, und bietet YAML-Regeldateien für Lint-Regeln und Codeänderungen. | Unterschiede zu GrephGreph verarbeitet nur PHP und liest keine YAML-Regeln. Bei einem kalten Scan war sg in Grephs CI-Benchmark für array($$$ITEMS) schneller. Der warme AST-Index von Greph beantwortete new $CLASS() in 10,89 ms, sg benötigte 4093.61 ms. |
| Rector | Gut geeignet fürModernisiert und refaktoriert PHP-Code mithilfe von Regeln und Regelsätzen. Unterstützt PHP-Versionen von 5.3 bis 8.5 sowie Projekte wie Symfony, PHPUnit und Doctrine. | Unterschiede zu GrephGreph schreibt Code anhand eines von dir verfassten Musters und einer Vorlage um. Die Dokumentation rät davon ab, wenn eine Änderung von Typinformationen abhängt, die PHP-Parser nicht aus einer einzelnen Datei ermitteln kann, oder Imports dateiübergreifend hinzugefügt oder entfernt werden müssen. |
| PHP CS Fixer | Gut geeignet fürKorrigiert Code, damit er Codierungsstandards entspricht, mit integrierten Regelsätzen wie dem PER Coding Style von PHP-FIG. | Unterschiede zu GrephGreph formatiert Dateien nicht neu. Es ändert nur Code, auf den ein Muster passt, und verweist in der Dokumentation auf PHP CS Fixer, wenn du einen Formatierer brauchst. |
Quellen, ausgewählt
Fragen und Antworten
Kurze Antworten aus der Greph-Dokumentation.
Nein. Greph führt Suche und Rewrite in PHP aus. Die externen Binärdateien rg, grep und sg werden nur für optionale Benchmark-Vergleiche verwendet.
Nur PHP. Muster und Quelldateien werden mit nikic/php-parser geparst; jeder andere Wert für --lang wird als nicht unterstützt abgelehnt.
Bei kalten Scans nicht. Im CI-Benchmark des Projekts für das WordPress-Korpus waren rg und grep bei jeder kalten Textabfrage schneller. Aufgewärmte Indizes beschleunigen wiederholte Abfragen: Bei einer indexierten Zählabfrage waren es beispielsweise 10,90 ms gegenüber 49,61 ms bei rg.
Greph läuft in einem einzelnen Prozess. Ohne pcntl_fork verarbeitet der Worker-Pool jeden Abschnitt innerhalb desselben Prozesses, mit demselben Ergebnis wie bei -j 1 und ohne Fehler auszulösen.
Außerhalb eines Treffers nicht. Code außerhalb der passenden Bytebereiche behält Leerraum, Kommentare und Layout bei. Der passende Code wird anhand der Vorlage neu ausgegeben; daher werden Zeilenumbrüche vereinheitlicht und Kommentare darin können verloren gehen. Führe den Befehl zuerst mit --dry-run aus, um die umgeschriebenen Dateien auszugeben, ohne sie zu speichern.
Standardmäßig in .greph-index, .greph-ast-index und .greph-ast-cache im jeweils indexierten Stammverzeichnis. Übergib einem beliebigen greph-index-Unterbefehl --index-dir, um einen anderen Speicherort zu verwenden.
Lies die Greph-Dokumentation zu CLI-Referenz, PHP API, indexierten Modi sowie den rg- und sg-Wrappern.