Greph
Saf PHP kod arama, yapısal arama ve yeniden yazma motoru. grep, ripgrep ve ast-grep iş akışlarını tek bir Composer paketinde sunar.
composer require greph/grephEn son sürüm 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)' srcUygulamada
Paketi Composer ile yükleyin, ardından komut satırından veya PHP üzerinden arama yapıp yeniden yazın.
Arama yapın, eşleşmeleri bulun ve yeniden yazmayı önizleyin
-F sabit dizeli metin araması yapar, -p metavariables gibi $CLASS içeren PHP biçimli bir desen alır ve -r bir değiştirme şablonu ekler. --dry-run yeniden yazılan dosyaları kaydetmeden yazdırır.
Statik Greph arayüzü, PHP koduna aynı işlemleri sunar. Bağımlılık olarak yüklendiğinde vendor/bin komutları için 0.2.3 veya üzeri sürüm gerekir.
# 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(),
);Saf PHP
Arama ve yeniden yazma, grep, ripgrep veya ast-grep ikili dosyası olmadan PHP 8.2+ üzerinde çalışır. json, ctype ve tokenizer eklentilerinin yanı sıra önbelleğe alınmış AST deposu için zlib kullanır.
Metin Arama
Tam sözcük, büyük/küçük harfe duyarsız, bağlam, sayım ve yalnızca dosya modlarıyla sabit dizeli ve regex araması. grep uyumlu çıktı.
AST Arama
PHP kaynak kodunda $VAR ve $$$VARIADIC üst değişkenleri, yinelenen yakalamalar ve JSON çıktısıyla yapısal arama. Desteklenen tek dil PHP'tür.
AST Yeniden Yazma
Deneme, etkileşimli ve yazma modlarında yapısal yeniden yazmalar. Yalnızca eşleşen kod değişir; eşleşme dışındaki yorumlar ve düzen olduğu gibi kalır.
İndeksli Modlar
Bir kez üçlü metin dizini, AST olgu dizini veya önbelleğe alınmış AST deposu oluşturup yeniden kullanın. Proje kıyaslamasında AST olgu dizininin oluşturulması 1.4 s sürdü ve new $CLASS() süresini 2.9 s'den 11 ms'ye indirdi; üçlü dizinin oluşturulması ise 12.3 s sürdü.
rg ve sg Sarmalayıcıları
vendor/bin/rg ve vendor/bin/sg, aynı motorda yaygın ripgrep ve ast-grep arama bayraklarını kabul eder. Desteklenmeyenler: rg'de çok satırlı arama, --replace, --type-add ve --sort; sg'de YAML kuralları ve PHP dışındaki diller.
PHP API
Greph::searchText(), searchAst() ve rewriteAst() türlenmiş sonuç nesneleri döndürür; böylece PHP kodu ve ajanlar, alt süreç kullanmadan motoru çağırabilir.
Oracle Derlemi
39 senaryo, greph metin, AST ve yeniden yazma çıktısını grep, ripgrep ve ast-grep ile karşılaştırır. Bunları bir depo klonunda composer test:oracle ile çalıştırın; CI birim ve entegrasyon paketlerini çalıştırır.
Greph neden tercih edilmeli
Yerel ikili dosya gerekmez
Arama ve yeniden yazma, PHP sürecinin içinde çalışır. rg, grep ve sg ikili dosyaları yalnızca isteğe bağlı kıyaslama karşılaştırmalarında kullanılır.
Her mod için tek motor
Metin arama, PHP yapısal arama ve yeniden yazma tek bir Composer paketinde bulunur. rg ve sg sarmalayıcıları, vendor/bin/greph ile aynı motoru çağırır.
Yeniden yazma yalnızca eşleşmelere dokunur
Yeniden yazıcı, oluşturulan şablonu eşleşen bayt aralıklarına ekler. Eşleşme dışındaki kodun girintisi, yorumları ve boş satırları korunur.
Arka plan hizmeti olmadan hazır dizinler
Dizinler diskte tutulur ve çalıştırmalar arasında yeniden kullanılır. Yaşam döngüsü profili, eski bir dizinin olduğu gibi bırakılacağını, arama sırasında yenileneceğini veya reddedileceğini belirler.
Karşılaştırma
Greph arama ve yeniden yazma işlemlerini PHP içinde tutar. Bu araçlar benzer sorunları çözer ve Greph'nin yapmadığı bazı işleri yapar.
| Araç | Şu konularda başarılı | Greph ile farkı |
|---|---|---|
| ripgrep | Şu konularda başarılıWindows, macOS, Linux için ilk sınıf desteği ve her sürüm için ikili indirmeler sunan, özyinelemeli bir regex arama aracıdır. Varsayılan olarak gitignore kurallarına uyar, gizli ve ikili dosyaları atlar. | Greph ile farkıGreph, Composer ile yüklenir ve PHP içinde çalışır. WordPress derlemi üzerinde CI kıyaslamasında, soğuk metin sorgularının tümünde rg daha hızlıydı; örneğin sabit dize aramasında 458.82 ms'ye karşı 81.62 ms. Sıcak Greph dizini, sayım sorgusunu rg'nin 49.61 ms süresine karşı 10.90 ms'de yanıtladı. |
| ast-grep | Şu konularda başarılıtree-sitter üzerine kurulu, yapısal arama, lint ve yeniden yazma için derlenmiş bir CLI. Aralarında PHP'in de bulunduğu birçok dil için yerleşik desteği ve lint kuralları ile kod değişiklikleri için YAML kural dosyaları vardır. | Greph ile farkıGreph yalnızca PHP işler ve YAML kurallarını okumaz. Soğuk taramada, Greph CI kıyaslamasında array($$$ITEMS) için sg daha hızlıydı. Greph'in sıcak AST dizini, new $CLASS() sorgusunu sg'nin 4093.61 ms süresine karşı 10.89 ms'de yanıtladı. |
| Rector | Şu konularda başarılıKurallar ve kural kümeleri aracılığıyla PHP kodunu günceller ve yeniden düzenler; 5.3 ile 8.5 arasındaki PHP sürümlerini ve Symfony, PHPUnit ve Doctrine gibi projeleri kapsar. | Greph ile farkıGreph, yazdığınız bir desen ve şablondan yeniden yazma yapar. Belgeleri, değişiklik tek bir dosyadan çözülemeyen tür bilgisine PHP-Parser bağlıysa veya dosyalar arasında içe aktarmaların eklenmesi ya da kaldırılması gerekiyorsa bu aracı uygun bulmaz. |
| PHP CS Fixer | Şu konularda başarılıKodlama standartlarına uyacak şekilde kodu düzeltir; PHP-FIG'ın PER Kodlama Stili gibi yerleşik kural kümeleri sunar. | Greph ile farkıGreph dosyaları yeniden biçimlendirmez. Yalnızca bir desenin eşleştirdiği kodu değiştirir; biçimlendirici istediğinizde belgeleri PHP CS Fixer'e yönlendirir. |
Kaynaklar, işaretli
Sorular ve yanıtlar
Greph dokümantasyonundan kısa yanıtlar.
Hayır. Greph arama ve yeniden yazma işlemlerini PHP içinde yapar. Harici rg, grep ve sg ikili dosyaları yalnızca isteğe bağlı kıyaslama karşılaştırmalarında kullanılır.
Yalnızca PHP. Desenler ve kaynak dosyalar nikic/php-parser ile ayrıştırılır; diğer tüm --lang değerleri desteklenmiyor diye reddedilir.
Soğuk taramalarda değil. Projenin WordPress derlemi üzerindeki CI kıyaslamasında, rg ve grep tüm soğuk metin sorgularında daha hızlıydı. Sıcak dizinler tekrarlanan sorguları hızlandırır; örneğin dizinlenmiş sayımda rg'nin 49.61 ms süresine karşı 10.90 ms.
Greph tek süreçte çalışır. pcntl_fork olmadan çalışan havuzu her parçayı süreç içinde işler; -j 1 ile aynı sonucu verir ve hata oluşturmaz.
Eşleşme dışında biçimlendirme yapmaz. Eşleşen bayt aralıklarının dışındaki kodun boşlukları, yorumları ve düzeni korunur. Eşleşen kod şablondan yeniden yazdırılır; bu nedenle satır sonları standartlaştırılır ve içindeki bir yorum kaybolabilir. Yeniden yazılan dosyaları kaydetmeden yazdırmak için önce --dry-run ile çalıştırın.
Varsayılan olarak dizinlenen kökteki .greph-index, .greph-ast-index ve .greph-ast-cache konumlarında saklanır. Başka bir konum kullanmak için herhangi bir greph-index alt komutuna --index-dir iletin.
Greph belgelerinde CLI başvurusu, PHP API, dizinli modlar ve rg ile sg sarmalayıcıları hakkında bilgi edinin.