
# Szövegkeresés

A Greph szöveges módja soronkénti, bájtalapú keresést végez egy bejárt fában. Ez a `greph` CLI és a `Greph::searchText()` homlokzat alapértelmezett módja. A kimenet a kanonikus `file:line:content` formátumot használja, amelyet a grep, a ripgrep és a legtöbb szerkesztőintegráció fel tud dolgozni.

## Gyors példák

```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
```

## Minták

Alapértelmezés szerint a mintát PCRE2 reguláris kifejezésként értelmezi. A motor működését a PHP `preg_*` függvényei biztosítják, ezért a szintaxis megfelel a [PHP PCRE-referenciának](https://www.php.net/manual/en/pcre.pattern.php).

Kapcsolja ki a reguláriskifejezés-motort a `-F` kapcsolóval, hogy a mintát literális bájtsorozatként kezelje. A rögzített karakterláncos mód a gyors út: a `strpos()` eszközt használja az egyezések kereséséhez, és teljesen kihagyja a PCRE2 fordítási lépését.

A `-i` mindkét módot kis- és nagybetűkre érzéketlenné teszi. A `-w` az egyezés két oldalán egészszó-határokat ad meg.

## Fájlok szűrése

A Greph végigjárja a fákat keresés előtt. A bejáró közös az AST-móddal és az indexelt móddal, így ugyanazok a szűrőjelzők mindenhol érvényesek.

| Jelző | Hatás |
|---|---|
| `--type NAME` | Csak a megadott típusálnévnek megfelelő fájlokat veszi fel (`php`, `js`, `md`, ...) |
| `--type-not NAME` | Kizárja a megadott típusálnévnek megfelelő fájlokat |
| `--glob GLOB` | Csak a GLOB mintának megfelelő elérési útú fájlokat veszi fel. Többször is megadható. |
| `--no-ignore` | Figyelmen kívül hagyja a `.gitignore` és a `.grephignore` szabályait |
| `--hidden` | Rejtett fájlokat is felvesz |

A bejáró alapértelmezés szerint figyelembe veszi a `.gitignore` és a `.grephignore` beállításait, kihagyja a bináris fájlokat (az első 512 bájtban található nullbájtok alapján felismerve), és 10 MiB-ban korlátozza a fájlméretet. Mindkét korlát a `WalkOptions` segítségével állítható be.

A beépített típusálnevek teljes listáját lásd a [API / FileTypeFilter](https://greph.inline0.dev/hu/docs/api#grephwalkerfiletypefilter) oldalon.

## Kontextus, darabszámok és csak fájlokat felsoroló módok

```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
```

A `-c`, a `-l` és a `-L` megkerüli a formázót, így nem kell minden sort memóriába töltenie. Ezek a megfelelő módok a „hány” és „hol” típusú lekérdezésekhez.

## Párhuzamos keresések

Adja meg a `-j N` kapcsolót, hogy a keresés N munkafolyamatra legyen szétosztva. A Greph a `pcntl_fork()` eszközt használja a munkafolyamat-készlethez, és egyetlen folyamatban történő végrehajtásra vált, ha a `ext-pcntl` nem érhető el.

```bash
./vendor/bin/greph -F -j 8 "function" src
```

A homlokzat a fájlok száma, az üzemmód és a minta alakja alapján számítja ki, hogy megéri-e a párhuzamos végrehajtás többletterhe. A küszöb alatt egyetlen folyamatot használ. A heurisztikákat lásd a [Speciális / Párhuzamos munkafolyamatok](https://greph.inline0.dev/hu/docs/advanced/parallel) oldalon.

## JSON kimenet

A `--json` strukturált adatot bocsát ki, amelyet a további eszközök a grep formátum képernyőről történő kinyerése nélkül is feldolgozhatnak:

```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": []
      }
    ]
  }
]
```

A `rg` burkoló ehelyett ripgrep-esemény alakú JSON adatot bocsát ki. Akkor használja, ha egy meglévő fogyasztó a ripgrep sémát várja.

## Programozott használat

```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";
    }
}
```

Az eredményobjektumok leírását lásd az [API / Eredményobjektumok](https://greph.inline0.dev/hu/docs/api#result-objects) oldalon.

## Működés

A szöveges motornak két útvonala van:

- **Literális útvonal**: ha be van állítva a `-F`, a keresés a `strpos()` segítségével, egy 64 KiB-os pufferelt olvasón fut, és a sorszámozáshoz nyomon követi az újsorokat. Nincs reguláriskifejezés-fordítási lépés.
- **Reguláriskifejezés-útvonal**: ha nincs beállítva a `-F`, a Greph egy kis, PCRE-szerű elemző (`Greph\Text\LiteralExtractor`) segítségével literális részkarakterláncokat nyer ki a mintából, majd ezeket `strpos()` előszűrőként használja. Az előszűrőn átjutó sorokat ezután a JIT-fordítást használó, lefordított PCRE2-mintával veti össze.

Mindkét útvonal ugyanazt a `BufferedReader` eszközt használja a beolvasáshoz. Az olvasó soronkénti `fgets()` helyett 64 KiB-os darabokban olvas, ami nagy fájlok esetén jelentősen csökkenti a rendszerhívások számát.

Ismétlődő feladatoknál az [indexelt szöveges mód](https://greph.inline0.dev/hu/docs/indexed/text) a pufferelt olvasót bemelegített trigram- és azonosító-előfordulásokat tároló tárra cseréli, és teljes egészében kihagyja a fájlok többségét.
