Metin Arama
Greph'ün metin modu, taranan dosya ağacında satır odaklı bir bayt aramasıdır. greph CLI'nin ve Greph::searchText() cephesinin varsayılan modudur. Çıktıda grep, ripgrep ve çoğu düzenleyici entegrasyonunun ayrıştırdığı standart file:line:content biçimi kullanılır.
Hızlı örnekler
# Regex search across the current directory
./vendor/bin/greph "function\s+\w+"
# Fixed-string search across src/
./vendor/bin/greph -F "function" src
# Case-insensitive whole-word search
./vendor/bin/greph -F -i -w "function" src
# Two lines of context around each match
./vendor/bin/greph -F -C 2 "TODO" src
# Stop after the first three matches per file
./vendor/bin/greph -F -m 3 "TODO" src
# Files that contain the pattern
./vendor/bin/greph -F -l "TODO" src
# Files that do not contain the pattern
./vendor/bin/greph -F -L "TODO" src
# Count matches per file
./vendor/bin/greph -F -c "TODO" src
# Inverted match
./vendor/bin/greph -F -v "TODO" src/notes.txt
Desenler
Varsayılan olarak desen, PCRE2 düzenli ifadesi olarak değerlendirilir. Altyapıyı PHP'ün preg_* işlevleri sağlar; dolayısıyla söz dizimi, PHP PCRE başvurusu ile eşleşir.
Deseni sabit bir bayt dizisi olarak değerlendirmek için -F ile regex motorunu kapatın. Sabit dizeli mod hızlı yoldur: eşleştirme için strpos() kullanır ve PCRE2 derleme adımını tamamen atlar.
-i her iki modu da büyük/küçük harfe duyarsız yapar. -w eşleşmenin iki tarafına da tam sözcük sınırları ekler.
Dosyaları filtreleme
Greph, aramadan önce dosya ağacını tarar. Gezici AST modu ve dizinli modla ortaktır; bu nedenle filtreleme bayrakları her yerde geçerlidir.
| Bayrak | Etki |
|---|---|
--type NAME |
Yalnızca adı verilen tür takma adıyla eşleşen dosyaları dahil eder (php, js, md, ...) |
--type-not NAME |
Adı verilen tür takma adıyla eşleşen dosyaları hariç tutar |
--glob GLOB |
Yalnızca yolları GLOB ile eşleşen dosyaları dahil eder. Tekrarlanabilir. |
--no-ignore |
.gitignore veya .grephignore kurallarına uymaz |
--hidden |
Gizli dosyaları dahil eder |
Gezici varsayılan olarak .gitignore ve .grephignore kurallarına uyar, ikili dosyaları atlar (ilk 512 bayttaki null baytlarla saptanır) ve dosya boyutunu 10 MiB ile sınırlar. Her iki sınır da WalkOptions aracılığıyla yapılandırılabilir.
Yerleşik tür takma adlarının tam listesi için API / DosyaTürüFiltresi bölümüne bakın.
Bağlam, sayımlar ve yalnızca dosya modları
# Two lines before and after each match
./vendor/bin/greph -F -C 2 "needle" src
# Two lines after, no lines before
./vendor/bin/greph -F -A 2 "needle" src
# Two lines before, no lines after
./vendor/bin/greph -F -B 2 "needle" src
# Count matches per file
./vendor/bin/greph -F -c "needle" src
# List matching files only
./vendor/bin/greph -F -l "needle" src
# List non-matching files only
./vendor/bin/greph -F -L "needle" src
-c, -l ve -L, her satırı belleğe almayı önlemek için biçimlendiriciyi kısa devreyle atlar. Bunlar, "kaç tane" ve "nerede" sorguları için uygun modlardır.
Paralel taramalar
Taramayı N işçiye dağıtmak için -j N iletin. Greph, işçi havuzu için pcntl_fork() kullanır ve ext-pcntl kullanılamadığında tek süreçli çalışmaya geri döner.
./vendor/bin/greph -F -j 8 "function" src
Cephe, dosya sayısına, moda ve desen biçimine göre paralel yürütmenin ek yüke değip değmeyeceğini hesaplar. Eşiğin altında tek süreçte kalır. Sezgisel kurallar için Gelişmiş / Paralel İşçiler bölümüne bakın.
JSON çıktısı
--json, alt araçların grep biçimini ekran görüntüsünden çözümlemesine gerek kalmadan ayrıştırabileceği yapılandırılmış bir yük üretir:
./vendor/bin/greph --json -F "function" src
[
{
"file": "src/Greph.php",
"matches": [
{
"line": 31,
"column": 1,
"content": "final class Greph",
"matched_text": "function",
"captures": []
}
]
}
]
rg sarmalayıcısı bunun yerine JSON biçiminde ripgrep olayları üretir. Mevcut bir tüketici ripgrep şemasını bekliyorsa bunu kullanın.
Programatik kullanım
use Greph\Greph;
use Greph\Text\TextSearchOptions;
$results = Greph::searchText(
'function',
'src',
new TextSearchOptions(
fixedString: true,
caseInsensitive: true,
beforeContext: 1,
afterContext: 1,
jobs: 4,
),
);
foreach ($results as $file) {
foreach ($file->matches as $match) {
echo "{$file->file}:{$match->line}:{$match->content}\n";
}
}
Sonuç nesneleri API / Sonuç nesneleri bölümünde belgelenmiştir.
Nasıl çalışır
Metin motorunun iki yolu vardır:
- Sabit dizeli yol:
-Fayarlandığında arama, 64 KiB'lik arabellekli bir okuyucudastrpos()yürütülür ve satır numaraları için satır sonları izlenir. Regex derleme adımı yoktur. - Regex yolu:
-Fayarlanmadığında Greph, küçük bir PCRE benzeri çözümleyici (Greph\Text\LiteralExtractor) kullanarak desenden sabit alt dizeleri çıkarır ve bunlarıstrpos()ön filtresi olarak kullanır. Ön filtreden geçen satırlar daha sonra JIT etkinleştirilmiş derlenmiş PCRE2 deseniyle eşleştirilir.
Her iki yol da G/Ç için aynı BufferedReader kullanır. Okuyucu, her satır için fgets() yerine 64 KiB'lik parçalar hâlinde okur; bu da büyük dosyalarda sistem çağrısı sayısını önemli ölçüde azaltır.
Tekrarlanan iş yüklerinde dizinli metin modu, arabellekli okuyucunun yerini ısıtılmış bir üçlü ve tanımlayıcı gönderim deposuyla alır ve dosyaların çoğunu tamamen atlar.