
# Tekstiotsing

Greph tekstirežiim otsib reahaaval baite läbi läbitud failipuu. See on `greph` CLI ja `Greph::searchText()` fassaadi vaikerežiim. Väljund järgib kanoonilist `file:line:content` vormingut, mida grep, ripgrep ja enamik redaktorite integratsioone suudavad parsida.

## Kiired näited

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

## Mustrid

Vaikimisi käsitletakse mustrit PCRE2 regulaaravaldisena. Mootori taga on PHP funktsioonid `preg_*`, seega vastab süntaks [PHP PCRE viitele](https://www.php.net/manual/en/pcre.pattern.php).

Lülitage regulaaravaldiste mootor `-F` abil välja, et käsitleda mustrit sõnasõnalise baidijadana. Fikseeritud stringi režiim on kiireim: see kasutab sobitamiseks `strpos()` ega käivita PCRE2 kompileerimisetappi.

`-i` muudab mõlemad režiimid tõstutundetuks. `-w` lisab vaste mõlemale poolele terve sõna piirid.

## Failide filtreerimine

Greph läbib enne otsimist failipuu. Läbikäija on sama, mida kasutavad AST-režiim ja indekseeritud režiim, seega kehtivad kõikjal samad filtreerimislipud.

| Lipp | Mõju |
|---|---|
| `--type NAME` | Kaasa ainult failid, mis vastavad nimetatud tüübialiasele (`php`, `js`, `md`, ...) |
| `--type-not NAME` | Jäta välja failid, mis vastavad nimetatud tüübialiasele |
| `--glob GLOB` | Kaasa ainult failid, mille teed vastavad mustrile GLOB. Võib korrata. |
| `--no-ignore` | Eira `.gitignore` ja `.grephignore` |
| `--hidden` | Kaasa peidetud failid |

Läbikäija järgib vaikimisi `.gitignore` ja `.grephignore`, jätab vahele binaarfailid (tuvastab need esimese 512 baidi nullbaitide põhjal) ning piirab failisuuruse 10 MiB-ga. Mõlemat piirangut saab seadistada `WalkOptions` kaudu.

Sisseehitatud tüübialiaste täieliku loendi leiate siit: [API / FileTypeFilter](https://greph.inline0.dev/et/docs/api#grephwalkerfiletypefilter).

## Kontekst, loendused ja ainult failide režiimid

```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` ja `-L` jätavad vormindaja vahele, et vältida kõigi ridade mällu laadimist. Need on sobivad režiimid päringutele „kui palju” ja „kus”.

## Paralleelsed skannimised

Edastage `-j N`, et jagada skannimine N töölõime vahel. Greph kasutab töölõimede kogumi jaoks `pcntl_fork()` ja läheb üle ühe protsessiga täitmisele, kui `ext-pcntl` pole saadaval.

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

Fassaad hindab failide arvu, režiimi ja mustri kuju põhjal, kas paralleeltäitmine on lisakulu väärt. Lävendist allpool kasutatakse üht protsessi. Heuristikate kohta leiate lisateavet jaotisest [Täpsemalt / Paralleeltöölised](https://greph.inline0.dev/et/docs/advanced/parallel).

## JSON-väljund

`--json` väljastab struktureeritud andmestiku, mida järgmised tööriistad saavad parsida ilma grep-vormingut ekraanilt kraapimata:

```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` ümbris väljastab selle asemel ripgrep-sündmuste kujul JSON. Kasutage seda, kui olemasolev tarbija ootab skeemi ripgrep.

## Programmipõhine kasutus

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

Tulemuseobjektide dokumentatsioon on jaotises [API / Tulemuseobjektid](https://greph.inline0.dev/et/docs/api#result-objects).

## Kuidas see töötab

Tekstimootoril on kaks töövoogu:

- **Sõnasõnaline töövoog**: kui `-F` on määratud, otsitakse `strpos()` abil 64 KiB puhvriga lugejast ja reanumbrite jaoks jälgitakse reavahetusi. Regulaaravaldist ei kompileerita.
- **Regulaaravaldise töövoog**: kui `-F` pole määratud, eraldab Greph mustrist väikese PCRE-laadse analüsaatori (`Greph\Text\LiteralExtractor`) abil sõnasõnalised alamstringid ja kasutab neid `strpos()` eelfiltrina. Eelfiltri läbinud ridu võrreldakse seejärel kompileeritud PCRE2 mustriga, mille JIT on lubatud.

Mõlemad töövood kasutavad sisend-väljundiks sama `BufferedReader`. Lugeja loeb `fgets()`-kaupa ridade kaupa lugemise asemel 64 KiB kaupa, mis vähendab suurte failide puhul süsteemikutsete arvu märkimisväärselt.

Korduvate töökoormuste korral asendab [indekseeritud tekstirežiim](https://greph.inline0.dev/et/docs/indexed/text) puhverdatud lugeja soojendatud trigrammi- ja identifikaatorite postituste andmebaasiga ning jätab enamiku faile täielikult vahele.
