Greph
Motore puro di ricerca del codice PHP, ricerca strutturale e riscrittura. Flussi di lavoro grep, ripgrep e ast-grep in un unico pacchetto Composer.
composer require greph/grephUltima versione 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)' srcNella pratica
Installate il pacchetto con Composer, poi cercate e riscrivete dalla riga di comando o da PHP.
Cercate, trovate corrispondenze e visualizzate l'anteprima di una riscrittura
-F esegue una ricerca testuale con stringa fissa, -p accetta un pattern in stile PHP con metavariabili come $CLASS e -r aggiunge un modello di sostituzione. --dry-run mostra i file riscritti senza salvarli.
La facade statica Greph espone le stesse operazioni al codice PHP. Se installati come dipendenza, i comandi vendor/bin richiedono la versione 0.2.3 o successiva.
# 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(),
);PHP puro
Ricerca e riscrittura vengono eseguite in PHP 8.2+, senza binari grep, ripgrep o ast-grep. Usa le estensioni json, ctype e tokenizer, oltre a zlib per l'archivio AST memorizzato nella cache.
Ricerca nel testo
Ricerca con stringhe fisse ed espressioni regolari, con modalità per parole intere, senza distinzione tra maiuscole e minuscole, con contesto, conteggio e solo file. Output compatibile con grep.
Ricerca AST
Ricerca strutturale del codice sorgente PHP con $VAR e metavariabili $$$VARIADIC, acquisizioni ripetute e output JSON. L'unico linguaggio supportato è PHP.
Riscrittura AST
Riscritture strutturali con modalità di simulazione, interattiva e di scrittura. Viene modificato solo il codice corrispondente; commenti e impaginazione esterni alla corrispondenza restano invariati.
Modalità indicizzate
Create una volta un indice testuale di trigrammi, un indice di fatti AST o un archivio AST memorizzato nella cache, poi riutilizzatelo. Nel benchmark del progetto, la creazione dell'indice di fatti AST ha richiesto 1.4 s e ha ridotto new $CLASS() da 2.9 s a 11 ms; l'indice di trigrammi ha richiesto 12.3 s.
Wrapper per rg e sg
vendor/bin/rg e vendor/bin/sg accettano i flag di ricerca ripgrep e ast-grep più comuni sullo stesso motore. Non sono supportati: multiline, --replace, --type-add e --sort in rg; le regole YAML e i linguaggi diversi da PHP in sg.
PHP API
Greph::searchText(), searchAst() e rewriteAst() restituiscono oggetti risultato tipizzati, così il codice PHP e gli agenti possono chiamare il motore senza un sottoprocesso.
Corpus di riferimento
39 scenari confrontano le differenze tra l'output di greph per testo, AST e riscrittura e quello di grep, ripgrep e ast-grep. Eseguiteli con composer test:oracle in una copia clonata del repository; CI esegue le suite di unità e integrazione.
Perché Greph
Nessun binario nativo
La ricerca e la riscrittura vengono eseguite all'interno del processo PHP. I binari rg, grep e sg vengono usati solo per i confronti benchmark facoltativi.
Un solo motore per ogni modalità
La ricerca testuale, la ricerca strutturale PHP e la riscrittura sono riunite in un unico pacchetto Composer. I wrapper rg e sg chiamano lo stesso motore di vendor/bin/greph.
Le riscritture modificano solo le corrispondenze
Il riscrittore inserisce il modello renderizzato negli intervalli di byte corrispondenti. Il codice esterno alle corrispondenze mantiene rientri, commenti e righe vuote.
Indici pronti all'uso senza demone
Gli indici risiedono su disco e vengono riutilizzati tra un'esecuzione e l'altra. Un profilo del ciclo di vita determina se un indice obsoleto viene lasciato invariato, aggiornato durante la ricerca o rifiutato.
A confronto con
Greph mantiene ricerca e riscrittura in PHP. Questi strumenti risolvono problemi correlati e alcune funzionalità di Greph non sono disponibili qui.
| Strumento | Ideale per | Differenze rispetto a Greph |
|---|---|---|
| ripgrep | Ideale perUno strumento di ricerca regex ricorsiva con supporto di prima classe per Windows, macOS e Linux, e download binari per ogni release. Rispetta le regole gitignore e per impostazione predefinita salta i file nascosti e binari. | Differenze rispetto a GrephGreph si installa con Composer e viene eseguito in PHP. Nel suo benchmark CI sul corpus WordPress, rg è stato più veloce per ogni query testuale a cache fredda, per esempio 81.62 ms contro 458.82 ms per una ricerca letterale. Un indice Greph già caricato ha risposto a una query di conteggio in 10.90 ms contro i 49.61 ms di rg. |
| ast-grep | Ideale perUn CLI compilato per la ricerca strutturale, il lint e la riscrittura, basato su tree-sitter. Supporta molte lingue, tra cui PHP, e file di regole YAML per il lint e le modifiche al codice. | Differenze rispetto a GrephGreph gestisce solo PHP e non legge regole YAML. In una scansione a cache fredda, sg è stato più veloce per array($$$ITEMS) nel benchmark CI di Greph. L'indice AST già caricato di Greph ha risposto a new $CLASS() in 10.89 ms contro 4093.61 ms di sg. |
| Rector | Ideale perAggiorna e rifattorizza il codice PHP tramite regole e set di regole, supportando le versioni PHP dalla 5.3 alla 8.5 e progetti come Symfony, PHPUnit e Doctrine. | Differenze rispetto a GrephGreph riscrive il codice a partire da un pattern e da un modello scritti da voi. La documentazione lo sconsiglia quando una modifica dipende da informazioni sui tipi che PHP-Parser non può ricavare da un singolo file o richiede di aggiungere o rimuovere import tra file. |
| PHP CS Fixer | Ideale perCorregge il codice per adeguarlo agli standard di programmazione, con set di regole integrati come PER Coding Style di PHP-FIG. | Differenze rispetto a GrephGreph non riformatta i file. Modifica solo il codice individuato da un pattern; la documentazione rimanda a PHP CS Fixer quando serve un formatter. |
Domande e risposte
Risposte brevi dalla documentazione di Greph.
No. Greph esegue ricerca e riscrittura in PHP. I binari esterni rg, grep e sg vengono usati solo per i confronti benchmark facoltativi.
Solo PHP. I pattern e i file sorgente vengono analizzati con nikic/php-parser; qualsiasi altro valore di --lang viene rifiutato come non supportato.
Non nelle scansioni a cache fredda. Nel benchmark CI del progetto sul corpus WordPress, rg e grep sono risultati più veloci per tutte le query testuali a cache fredda. Gli indici precaricati aiutano nelle query ripetute: per esempio, una query di conteggio indicizzata ha richiesto 10.90 ms contro i 49.61 ms di rg.
Greph viene eseguito in un singolo processo. Senza pcntl_fork, il pool di worker elabora ogni blocco all'interno dello stesso processo, con lo stesso risultato di -j 1, senza generare errori.
Non al di fuori delle corrispondenze. Il codice esterno agli intervalli di byte corrispondenti mantiene spazi, commenti e impaginazione. Il codice corrispondente viene ristampato dal modello, quindi le interruzioni di riga vengono uniformate e un commento al suo interno può andare perso. Eseguite prima il comando con --dry-run per visualizzare i file riscritti senza salvarli.
Per impostazione predefinita, in .greph-index, .greph-ast-index e .greph-ast-cache nella radice indicizzata. Passate --index-dir a qualsiasi sottocomando greph-index per usare un'altra posizione.
Consultate la documentazione Greph per il riferimento CLI, PHP API, le modalità indicizzate e i wrapper rg e sg.