Aller au contenu

Greph

Moteur de recherche de code PHP, de recherche structurelle et de réécriture. Workflows grep, ripgrep et ast-grep dans un seul paquet Composer.

Terminal
composer require greph/greph

Dernière version v0.2.3 MIT PHP 8.2+

En pratique

Installez le paquet avec Composer, puis effectuez des recherches et des réécritures en ligne de commande ou depuis PHP.

Rechercher, faire correspondre et prévisualiser une réécriture

-F effectue une recherche de texte par chaîne fixe, -p prend un motif de forme PHP avec des métavariables comme $CLASS, et -r ajoute un modèle de remplacement. --dry-run affiche les fichiers réécrits sans les enregistrer.

La façade statique Greph expose les mêmes opérations au code PHP. Une fois installées comme dépendances, les commandes vendor/bin nécessitent la version 0.2.3 ou ultérieure.

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

PHP pur

Recherche et réécriture dans PHP 8.2+, sans binaire grep, ripgrep ni ast-grep. Utilise les extensions json, ctype et tokenizer, ainsi que zlib pour le stockage AST en cache.

Recherche de texte

Recherche par chaîne fixe ou expression régulière, avec options de correspondance de mots entiers, insensible à la casse, de contexte, de comptage et de filtrage par fichier. Sortie compatible avec grep.

Recherche AST

Recherche structurelle dans le code source PHP avec $VAR et les métavariables $$$VARIADIC, les captures répétées et la sortie JSON. PHP est le seul langage pris en charge.

Réécriture AST

Réécritures structurelles avec modes simulation, interactif et écriture. Seul le code correspondant est modifié ; les commentaires et la mise en page hors des correspondances restent tels quels.

Modes indexés

Créez une fois un index texte trigramme, un index de faits AST ou un stockage AST en cache, puis réutilisez-le. Dans le benchmark du projet, la création de l'index de faits AST a pris 1.4 s et réduit new $CLASS() de 2.9 s à 11 ms ; l'index trigramme a pris 12.3 s.

Enveloppes rg et sg

vendor/bin/rg et vendor/bin/sg acceptent les options de recherche courantes ripgrep et ast-grep sur le même moteur. Non pris en charge : mode multiligne, --replace, --type-add et --sort dans rg ; règles YAML et langages non-PHP dans sg.

PHP API

Greph::searchText(), searchAst() et rewriteAst() renvoient des objets de résultat typés ; le code PHP et les agents peuvent ainsi appeler le moteur sans sous-processus.

Corpus de référence

39 scénarios comparent la sortie texte, AST et réécriture de greph à celle de grep, ripgrep et ast-grep. Exécutez-les avec composer test:oracle dans un clone du dépôt ; la CI lance les suites de tests unitaires et d'intégration.

Pourquoi Greph

Aucun binaire natif

La recherche et la réécriture s'exécutent dans le processus PHP. Les binaires rg, grep et sg servent uniquement aux comparaisons de benchmarks facultatives.

Un moteur pour chaque mode

La recherche de texte, la recherche structurelle PHP et la réécriture sont regroupées dans un seul paquet Composer. Les enveloppes rg et sg appellent le même moteur que vendor/bin/greph.

Les réécritures ne touchent que les correspondances

Le moteur de réécriture insère le modèle rendu dans les plages d'octets correspondantes. Le code hors de ces plages conserve son indentation, ses commentaires et ses lignes vides.

Des index préchauffés sans démon

Les index sont stockés sur disque et réutilisés d'une exécution à l'autre. Un profil de cycle de vie détermine si un index obsolète est laissé tel quel, actualisé pendant la recherche ou refusé.

Comparaison avec

Greph regroupe la recherche et la réécriture dans PHP. Ces outils résolvent des problèmes connexes et certaines tâches que Greph ne prend pas en charge.

Greph comparé à d'autres outils
ripgrep Idéal pourOutil de recherche récursive par expressions régulières, avec prise en charge de premier ordre sur Windows, macOS et Linux, et téléchargements binaires pour chaque version. Respecte les règles gitignore et ignore par défaut les fichiers cachés et binaires. Différence avec GrephGreph s'installe avec Composer et s'exécute dans PHP. Dans son benchmark CI sur le corpus WordPress, rg était plus rapide pour chaque requête texte à froid, par exemple 81.62 ms contre 458.82 ms pour une recherche littérale. Un index Greph préchauffé répondait à une requête de comptage en 10.90 ms contre 49.61 ms pour rg.
ast-grep Idéal pourUn CLI compilé pour la recherche structurelle, l'analyse statique et la réécriture, basé sur tree-sitter. Il prend en charge de nombreux langages, dont PHP, et des fichiers de règles YAML pour l'analyse statique et les modifications de code. Différence avec GrephGreph ne prend en charge que PHP et ne lit aucune règle YAML. Lors d'une analyse à froid, sg était plus rapide pour array($$$ITEMS) dans le benchmark CI de Greph. L'index AST préchauffé de Greph répondait à new $CLASS() en 10.89 ms contre 4093.61 ms pour sg.
Rector Idéal pourMet à niveau et remanie le code PHP au moyen de règles et d'ensembles de règles ; prend en charge les versions PHP de 5.3 à 8.5 et des projets comme Symfony, PHPUnit et Doctrine. Différence avec GrephGreph réécrit le code à partir d'un motif et d'un modèle que vous définissez. Sa documentation déconseille de l'utiliser lorsque la modification dépend d'informations de type que PHP-Parser ne peut pas résoudre à partir d'un seul fichier, ou nécessite d'ajouter ou de supprimer des imports entre plusieurs fichiers.
PHP CS Fixer Idéal pourCorrige le code pour qu'il respecte les normes de codage, avec des ensembles de règles intégrés tels que PER Coding Style de PHP-FIG. Différence avec GrephGreph ne reformate pas les fichiers. Il ne modifie que le code correspondant à un motif ; sa documentation renvoie à PHP CS Fixer si vous avez besoin d'un formateur.

Questions et réponses

Réponses courtes issues de la documentation de Greph.

Consultez la documentation de Greph pour découvrir la référence CLI, les PHP API, les modes indexés et les enveloppes rg et sg.