Regulární výrazy I - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



PHP

Regulární výrazy I

redakcni system

21. ledna 2002, 00.00 | Dnes při tvorbě redakčního systému načneme téma fulltextového vyhledávání. Jako teoretický základ si nejprve vysvětlíme co jsou to regulární výrazy a jak je používat.

Slíbil jsem fulltextové vyhledávání. Ještě než se pustíme do samotných scriptů, chci vám říci, že je postavené tak, aby pracovalo s regulárními výrazy. Přemýšlel jsem nad tím, a zvolil jsem právě cestu regulárních výrazů, neboť dovolují možnosti fulltextu lépe, i když ne úplně využít.

Co to jsou regulární výrazy? Možná o tom ani nevíte a už je používáte. Nejčastěji asi když hledáte ve Windows nějaký určitý druh souborů např. obrázky typu JPEG. V tom případě zadáte *.jpeg a program vyhledá všechny soubory s koncovkou jpeg. A právě *.jpeg je regulární výraz. Je to jakési síto, které pomáhá pokud hledáte slova s určitým kořenem. Zadáte kořen slova, přidáte metaznaky (viz. níže) a vyhledávač vám "vyplivne" všechny slova které tomu regulárnímu výrazu odpovídají. Fulltext je jakési síto. Jako když prohazujete písek. Přes prohazovačku projdou pouze částice písku, které svojí velikostí vyhovují otvorům v prohazovačce. A právě ty otvory jsou regulární výrazy. V přeneseném slova smyslu.

Podívejme se tedy na ty regulární výrazy. My nebudeme využívat PCRE (The Perl-compatible regular expression), jenž sice nabízí největší možnosti, ale pro naše potřeby jsou téměř nevyužitelné. Jednak naučit se všechny metaznaky a umět je správně používat, dá větší práci než regulární výrazy, které budeme používat my a výsledek bude prakticky stejný.

V PHP máme funkce, které pomocí regulárních výrazů - masky, dokáží dokonce separovat jednotlivé části řetězce, ale to možná někdy jindy. Regulární výraz je textový řetězec, který obsahuje nějaké znaky. Řetezec pak vyhovuje regulárnímu výrazu, pokud v sobě obsahuje tyto znaky. Například regulárnímu výrazu stra, bude vyhovovat stra, strach, výstraha či strava. všechny v soubě mají "stra".

Velmi jednoduché, že? Ale pozor! Přidáme si první metaznak. Je jím ^. Tento znak zastupuje začátek řetězce. To znamená, že výrazu ^stra vyhoví stratosféra, strašit, ale ne postrašit.

Další metaznak je $. Ten naopak zastupuje konec řetězce. To jest sa$ vyhoví husa, basa, rosa, ne však sad.

Jak ale udělat výraz když chceme najít třeba k^j nebo k$j? Velice jednoduše pomocí escape sekvencí. Vznikne nám tedy k\^j a k\$j. Podobně postupujeme i u ostatních meteznaků. Prostě z nich jen uděláme escape sekvence. Jak jednoduché.

To však není vše, co nám regulární výrazy poskytují. Velmi často používaný a užitečný je .. Tečka zastupuje jeden libovolný znak a to i netisknutelný (mezera, tabulátor atd.) Výrazu r.t vyhovují rst, rXt, r6t. Nevyhovuje řetěze rkjt. Pokud hledáme řetězec s tečkou použijeme \..

O následujícím znaku *, již bylo hovořeno před chvílí. Hvězdička nám říká, že výraz se může opakovat kolikrát chce nebo nemusí být přítomen vůbec.

S opakováním souvisí další znak je to ?. Ten naopak říká, že výraz se smí vyskytovat nejvýše jednou, to znamená ani jednou nebo jednou. Jinak se výraz neshoduje

Poslední z opakovacích znaků je +. Vyjadřuje, že výraz se musí vyskytovat alespoň jednou. To znamená, že tam může být jednou, dvakrát, stokrát, milionkrát, ale musí tam být

Několik příkladů Výrazu .* vyhoví všechny řetězce a dokonce i prázdný. Tečka nám říká, že se může vyskytovat libovolný znak a hvězdička zase, že se může opakovat kolikrát chce.

Regulárnímu výrazu ij+k vyhoví řetězec, kde jsou znaky i a k mezi kterými je libovolný nenulový počet znaků j. To jsou řetězce ijk, ijjk, ijjjjjjjjjjjjk, asdfijkrt nikoliv však ik.

Výrazu ij?k vyhoví pouze řetězce ik nebo ijk. Písmeno j se zde vyskytuje nanejvýše jednou.

Zatím se metaznaky vztahovaly k jednomu poslednímu znaku. Pokud chceme, aby se opakovala větší část výrazu, stačí když tuto část dáme do závorek. Když například chceme vytvořit regulární výraz, kde se neustále opakují pouze písmena xy, použijeme ho v tomto tvaru ^(xy)+$ .

Někdy však potřebujeme, aby se určitá část opakovala tolikrát, kolikrát potřebujeme. V těchto případech použijeme metaznak { a }. Syntaxe je tato: {min, max}. Tímto zápisem říkáme, že předchozí podvýraz se má opakovat minimálně min krát a maximálně max krát. Pokud tedy máme z{1,8}, znamená to, že nám vyhovují řetězce, kde najdeme 1 až 8 z za sebou.

S tímto metaznekem však máme ještě jiné možnosti. Když chceme určit pouze minimální počet opakování, napíšeme {min,}. Když chceme, aby se znak opakoval n krát použijeme syntaxi {n}.

Myslím, že pro začátek by to stačilo. Pokuste se to do příště do hlavy nějak dostat a přemýšlejte nad tím, jak to podat uživateli, aby možnosti našeho fulltextu plně využil. Příště regulární výrazy dokončíme.

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » PHP  

 » Rubriky  » Web  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: