Hoppa till innehåll

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.

Terminal
composer require greph/greph

Senaste versionen v0.2.3 MIT PHP 8.2+

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

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

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.

Greph jämfört med andra verktyg
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.

Frågor och svar

Korta svar från dokumentationen för Greph.

Läs Greph-dokumentationen för referensen CLI, PHP API, de indexerade lägena samt omslagen rg och sg.