Greph
Ren PHP-kod för sökning, strukturell sökning och omskrivning. Arbetsflöden för grep, ripgrep och ast-grep i ett enda Composer-paket.
composer require greph/grephSenaste versionen 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)' srcI praktiken
Installera paketet med Composer och sök och skriv sedan om från kommandoraden eller från PHP.
Sök, matcha och förhandsgranska en omskrivning
-F kör en textsökning med fasta strängar, -p tar ett mönster utformat efter PHP med metavariabler som $CLASS, och -r lägger till en ersättningsmall. --dry-run skriver ut de omskrivna filerna utan att spara ändringarna.
Den statiska fasaden Greph exponerar samma operationer för PHP-kod. När kommandona vendor/bin installeras som ett beroende kräver de version 0.2.3 eller senare.
# 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(),
);Ren PHP
Sökning och omskrivning körs i PHP 8.2+ utan grep-, ripgrep- eller ast-grep-binärfil. Använder tilläggen json, ctype och tokenizer samt zlib för det cachade AST-lagret.
Textsökning
Sökning med fasta strängar och regex, med lägen för hela ord, skiftlägesokänslighet, kontext, antal och endast filer. grep-kompatibel utdata.
AST-sökning
Strukturell sökning i PHP-källkod med $VAR och metavariablerna $$$VARIADIC, upprepade infångningar och utdata i formatet JSON. Endast PHP stöds.
AST-omskrivning
Strukturella omskrivningar med lägen för provkörning, interaktiv körning och skrivning. Endast matchad kod ändras; kommentarer och layout utanför en matchning förblir oförändrade.
Indexerade lägen
Skapa ett textindex baserat på trigram, ett AST-faktindex eller ett cachat AST-lager en gång och återanvänd det. I projektets riktmärke tog AST-faktindexet 1.4 s att bygga och minskade new $CLASS() från 2.9 s till 11 ms; trigramindexet tog 12.3 s.
Omslag för rg och sg
vendor/bin/rg och vendor/bin/sg accepterar de vanliga sökflaggorna ripgrep och ast-grep i samma motor. Stöds inte: multiline, --replace, --type-add och --sort i rg; reglerna YAML och språk utanför PHP i sg.
PHP API
Greph::searchText(), searchAst() och rewriteAst() returnerar typade resultatobjekt, så PHP-kod och agenter kan anropa motorn utan en underprocess.
Oracle-korpus
39 scenarier jämför grephs text-, AST- och omskrivningsutdata med grep, ripgrep och ast-grep. Kör dem med composer test:oracle i en klon av kodarkivet; CI kör enhets- och integrationstesterna.
Varför Greph
Inga inbyggda binärfiler
Sökning och omskrivning körs i PHP-processen. Binärfilerna rg, grep och sg används endast för de valfria riktmärkesjämförelserna.
En motor för varje läge
Textsökning, PHP strukturell sökning och omskrivning ingår i ett enda Composer-paket. Omslagen rg och sg anropar samma motor som vendor/bin/greph.
Omskrivningar påverkar bara matchningar
Omskrivaren fogar den renderade mallen till de matchade bytesintervallen. Kod utanför en matchning behåller sin indragning, sina kommentarer och sina tomrader.
Uppvärmda index utan en demon
Index lagras på disk och återanvänds mellan körningar. En livscykelprofil avgör om ett inaktuellt index lämnas som det är, uppdateras under sökningen eller avvisas.
Jämfört med
Greph samlar sökning och omskrivning i PHP. Dessa verktyg löser närliggande problem och gör en del saker som Greph inte gör.
| Verktyg | Bra på | Skillnaden jämfört med Greph |
|---|---|---|
| ripgrep | Bra påEtt rekursivt regexsökverktyg med förstklassigt stöd för Windows, macOS och Linux samt binärnedladdningar för varje version. Det följer gitignore-regler och hoppar som standard över dolda filer och binärfiler. | Skillnaden jämfört med GrephGreph installeras med Composer och körs i PHP. I dess CI-riktmärke på korpuset WordPress var rg snabbare vid varje kall textsökning, till exempel 81.62 ms jämfört med 458.82 ms vid en sökning efter en bokstavlig sträng. Ett uppvärmt Greph-index besvarade en räknefråga på 10.90 ms jämfört med 49.61 ms för rg. |
| ast-grep | Bra påEn kompilerad CLI för strukturell sökning, lintning och omskrivning, byggd på tree-sitter. Den har inbyggt stöd för många språk, däribland PHP, samt YAML-regel-filer för lintregler och kodändringar. | Skillnaden jämfört med GrephGreph hanterar endast PHP och läser inga YAML-regler. Vid en kall genomsökning var sg snabbare för array($$$ITEMS) i Grephs CI-riktmärke. Grephs uppvärmda AST-index besvarade new $CLASS() på 10.89 ms jämfört med 4093.61 ms för sg. |
| Rector | Bra påUppgraderar och refaktorerar PHP-kod med regler och regeluppsättningar, med stöd för PHP-versioner från 5.3 till 8.5 och projekt som Symfony, PHPUnit och Doctrine. | Skillnaden jämfört med GrephGreph skriver om utifrån ett mönster och en mall som du själv skriver. Dokumentationen avråder från att använda det när en ändring är beroende av typinformation som PHP-Parser inte kan lösa från en enda fil, eller när importer måste läggas till eller tas bort mellan filer. |
| PHP CS Fixer | Bra påRättar kod så att den följer kodningsstandarder, med inbyggda regeluppsättningar som PHP-FIG:s PER-kodningsstil. | Skillnaden jämfört med GrephGreph formaterar inte om filer. Det ändrar endast kod som matchas av ett mönster, och dokumentationen hänvisar till PHP CS Fixer om du vill ha en formatterare. |
Källor, markerad
Frågor och svar
Korta svar från dokumentationen för Greph.
Nej. Greph kör sökning och omskrivning i PHP. De externa binärfilerna rg, grep och sg används endast för de valfria riktmärkesjämförelserna.
Endast PHP. Mönster och källfiler parsas med nikic/php-parser, och alla andra värden för --lang avvisas som ej stödda.
Inte vid kalla genomsökningar. I projektets CI-riktmärke på korpuset WordPress var rg och grep snabbare vid varje kall textsökning. Uppvärmda index hjälper vid upprepade frågor, till exempel 10.90 ms jämfört med 49.61 ms för rg vid en indexerad räkning.
Greph körs i en process. Utan pcntl_fork kör arbetargruppen varje block i samma process, med samma resultat som -j 1, och inget fel uppstår.
Inte utanför en matchning. Kod utanför de matchade bytesintervallen behåller sina blanksteg, kommentarer och sin layout. Den matchade koden skrivs ut på nytt från mallen, så radbrytningarna normaliseras och en kommentar inuti den kan gå förlorad. Kör med --dry-run först för att skriva ut de omskrivna filerna utan att spara dem.
Som standard i .greph-index, .greph-ast-index och .greph-ast-cache i den indexerade rotkatalogen. Skicka --index-dir till valfritt greph-index-underkommando för att använda en annan plats.
Läs Greph-dokumentationen för referensen CLI, PHP API, de indexerade lägena samt omslagen rg och sg.