
# 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

```bash
# 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](https://www.php.net/manual/en/pcre.pattern.php) 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](https://greph.inline0.dev/tr/docs/api#grephwalkerfiletypefilter) bölümüne bakın.

## Bağlam, sayımlar ve yalnızca dosya modları

```bash
# 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.

```bash
./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](https://greph.inline0.dev/tr/docs/advanced/parallel) 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:

```bash
./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](https://greph.inline0.dev/tr/docs/api#result-objects) 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](https://greph.inline0.dev/tr/docs/indexed/text), arabellekli okuyucunun yerini ısıtılmış bir üçlü ve tanımlayıcı gönderim deposuyla alır ve dosyaların çoğunu tamamen atlar.
