Vai al contenuto

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.

Terminale
composer require greph/greph

Ultima versione v0.2.3 MIT PHP 8.2+

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

Terminale
# 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

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.

Greph a confronto con altri strumenti
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.

Consultate la documentazione Greph per il riferimento CLI, PHP API, le modalità indicizzate e i wrapper rg e sg.