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 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řída | Popis 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 |
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):
- Redakční systém I.
- Redakční systém II.
- Redakční systém III.
- Redakční Systém IV.
- Redakční systém V.
- Redakční systém VI.
- Redakční systém VII.
- Redakční systém VIII
- Redakční systém - tisk
- Redakční systém - generování
- Redakční systém - generování II.
- Redakční systém - generování III.
- Redakční systém - generování IV
- Redakční systém - generování V.
- Redakční systém - krátké zprávy a CSS styly
- Upload obrázků
- Upload - II a logout
- Schvalování článků - II
- Dodatečné přidání obrázku
- Regulární výrazy I
- Regulární výrazy II
- Redakční systém: Fulltext - I.
- Fulltext - II
- Co s RS?
- Optimalizace databáze v RS
- Interní vzkazy - I
- Interní vzkazy - II
- Interní vzkazy - III
- Náměty od čtenářů - I
- Náměty od čtenářů - II
- Náměty od čtenářů - III
- Náměty od čtenářů - IV
- Náhrada FTP
- Ankety
Diskuse k článku
-
25. listopadu 2012
-
30. srpna 2002
-
10. října 2002
-
4. listopadu 2002
-
12. září 2002
-
25. listopadu 2012
-
28. července 1998
-
31. července 1998
-
28. srpna 1998
-
6. prosince 2000
-
27. prosince 2007
-
4. května 2007