Zum Inhalt springen

Greph

Reine PHP-Codesuche, Struktursuche und Rewrite-Engine. grep-, ripgrep- und ast-grep-Arbeitsabläufe in einem Composer-Paket.

Terminal
composer require greph/greph

Neueste Version v0.2.3 MIT PHP 8.2+

In 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.

Terminal
# 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 src

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.

Greph im Vergleich zu anderen Werkzeugen
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.

Fragen und Antworten

Kurze Antworten aus der Greph-Dokumentation.

Lies die Greph-Dokumentation zu CLI-Referenz, PHP API, indexierten Modi sowie den rg- und sg-Wrappern.