İçeriğe geç

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.

Terminal
composer require greph/greph

En son sürüm v0.2.3 MIT PHP 8.2+

Uygulamada

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.

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

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.

Greph ile diğer araçların karşılaştırması
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.

Sorular ve yanıtlar

Greph dokümantasyonundan kısa yanıtlar.

Greph belgelerinde CLI başvurusu, PHP API, dizinli modlar ve rg ile sg sarmalayıcıları hakkında bilgi edinin.