Regulární výrazy II - 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:

Soutěž

Sponzorem soutěže je:

IDIF

 

Kdo je autorem výstavy obrazových fotografií „Očima Hanse Christiana Andersena“?

V dnešní soutěži hrajeme o:



PHP

Regulární výrazy II

redakcni system

29. ledna 2002, 00.00 | Dnes povídání o regulárních výrazech zakončíme a předvedeme si pár ukázek.

Poznámka redaktora: článek na podobné téma již na Builderu vyšel a to od pana Bražiny zde a zde v rámci seriálu Učíme se jazyk PHP. Berte prosím toto povídání jako malé opakování, před vlastní implementací fulltextového vyhledávání v Redakčním systému (rovněž články nejsou identické, takže i tak mohou být pro čtenáře přínosem).

Minule jsme začali regulární výrazy. Ty dnes dokončíme a předvedeme si pár ukázek.

Už známe metaznak ., který zastupuje libovolný znak, ale někdy potřebujeme, aby to byl pouze znak z určité skupiny znaků. Proto máme metaznak [ a ]. Když do závorek napíšeme více znaků, regulárnímu výrazu vyhoví řetězec, který obsahuje jeden z těchto znaků. Výrazu [xy]z vyhoví řetězec xz a yz.

Když uvedeme tento výraz ja[^jk], nebudou mu vyhovovat řetězce jaj a jak. Všechny ostatní jako jaf, jat, jam a tak dále ano. Co jsme tedy zjistili? Když je v závorce znak ^, vyhovují regulárnímu výrazu jen řetězce, kde se nevyskytují ty znaky, které jsou v závorce. Zápis uvnitř metaznaku [ a ] můžeme i efektivně zkrátit. Tak například [a-z] vyhoví všechny znaky, které se lexikograficky vyskytují mezy znaky a a z. Nesmíme ovšem zapomenout, že PHP pracuje se znaky anglické abecedy. To jest, že na znaky jako Ž,ž,Š,š,Á,á a podobně si můžeme nechat zajít chuť. Jak to obejít si ukážeme později.

Když budeme mít složitější výrazy, hodí se nám metaznak |. Stejnou funkci má || v podmínkách. Tento znak nám rozdělí řetězec na několik podvýrazů. Řetězec pak vyhovuje, když vyhovuje alespoň jedné jeho části. Pokud hledáme českou zkratku dne v týdnu použijeme:

Po|Út|St|Čt|Pá|So|Ne

Následující výraz bude vyhovovat českým i anglickým zkratkám dnů. Je to výraz

(Po|Út|St|Čt|Pá|So|Ne)|(Mon|Tue|Wed|Thu|Fri|Sat|Sun)

Může udělat i výraz, kterému nezáleží na velikosti písmen. Ten bude vypadat následovně

((P|p)o|(Ú|ú)t|(S|s)t|(Č|č)t|(P|p)á|(S|s)o|(N|n)e)|((M|m)on|(T|t)ue|(W|w)ed|(T|t)hu|(F|f)ri|(S|s)at|((S|s)un)

Celé to lze zkrátit, pokud známe metaznak [ a ].

([Pp]o|[Úú]t|[Ss]t|[Čč]t|[Pp]á|[Ss]o|[Nn]e)|([Mm]on|[Tt]ue|[Ww]ed|[Tt]hu|[Ff]ri|[Ss]at|([Ss]un)

Velice zajímavé jsou výrazy [[:<:]] a [[:>:]]. Ty zastupují začátek a konec slova. Když chceme vytvořit výraz, který vyhoví řetězci Novák ale ne jménu jeho manželky, Použijeme [[:<:]]Novák[[:>:]].

Poslední, co probereme, je výraz [[:třída:]], kde třída zastupuje jeden libovolný znak, který patří do třídy. K dispozici je jich několik. Jejich přehled je uveden v tabulce. Znovu připomínám, že pracují pouze s anglickou abecedou.

TřídaPopis třídy
  alnum   Alfanumerické znaky (písmena anglické abecedy a číslice)
alpha Písmena anglické abecedy
blank Mezera a tabulátor
cntrl Řídící znaky
digit Číslice
graph Všechny znaky, které mají grafickou podobu
lower Malá písmena anglické abecedy
print Tisknutelné znaky
punct Interpunkční a další znaky (zavináče, závorky a další taková verbeš)  
space Jakákoliv mezera
upper Velká písmena anglické abecedy
xdigit Šestnáctkové číslice (číslice a písmeny a-f a A-F)

Když tedy budeme hledat šestimístné číslo, zadáme: [[:<:]][[:digit:]]{6}[[:>:]]

Sami vidíte, že se nám ty regulární výrazy začínají nějak vymykat z rukou. Proto raději skončíme. Je to více méněvšechno. Zbývají jen nějaké téměř nepoužitelné výrazy. Koho to však zaujalo, nechť se podívá do originální dokumentace, kde najde i PCRE (viz. předchozí díl). Další možností je zadání příkazu man regex, který ale na Windowsech moc často nefunguje.

Slíbil jsem ještě pár příkladů, které se mohou hodit. Tak tady máme první: ^[\+\-]?[0123456789]+$ Tímto výrazem najdeme všechna celá čísla. Doplním o malý komentář. Metaznak ^ nám označuje začátek řetězce a $ zase konec. Celé číslo může mít znaménko + nebo -. Protože to jsou metaznaky, musí tam být zpětné lomítko. Znaménko tam však vůbec být nemusí a tak je tam ?. V závorce je výčet znaků, které desítková soustava používá. Cifra ale musí být alespoň jedna. Proto znaménko +. Vše jde však zkrátit na výraz ^[\+\-]?[0-9]+$. Víme totiž, že mezi 0 a 9 leží lexikograficky znaky 1,2,3,4,5,6,7 a 8, tedy včechny čísla, co ptřebujeme.

Slíbil jsem regulární výraz pro znaky české abecedy. Nejprve si uvědomme, jak se obě abecedy liší. Česká obsahuje celou anglickou. To znamená, že můžeme použít a-z. Navíc jsou tam á,č,ď,é,ě,í,ň,ó,ř,š,ť,ů,ú,ý a ž. Nezbývá než je spojit do jednoho, aby jsme nakonec dostali [a-záčďéěíňóřšťůúýž].

To je všechno hezké, ale teď něco z normálního života. Když hledáte e-mail, použijte následující regulární výraz ^[^@]+@[^.]+\..+$. Ten nám říká následující. E-mail začíná (^) alespoň jedním znakem (+), který není zavináč ([^@]). Následuje zavináč, tečka (\.), pak alespoň jeden (+) znak (.), tečka (\.) a národní koncovka, která má alespoň jeden (+) znak (.). A to je konec ($).

Jak jednoduché a jak účinné. Příště již se opravdu pustíme do zdrojového kódu, který je asi to, na co všichni čakáte.

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: