İçeriğe geç

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

Kabuk
# 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ı

Kabuk
# 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.

Kabuk
./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:

Kabuk
./vendor/bin/greph --json -F "function" src
JSON
[
  {
    "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

PHP
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: -F ayarlandığında arama, 64 KiB'lik arabellekli bir okuyucuda strpos() yürütülür ve satır numaraları için satır sonları izlenir. Regex derleme adımı yoktur.
  • Regex yolu: -F ayarlanmadığı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.