Programování Bc. Veronika Tomsová
Regulární výrazy
Regulární výrazy slouží k porovnání a zpracovaní textu PHP podporuje syntaxi POSIX-Extended Regulární výrazy jsou velice vhodné například k ověření emailové adresy Regulární vyraz je takový výraz, kterému určitý text vyhovuje (true), nebo nevyhovuje (false). 3/31
Speciální znaky (metaznaky) Speciální znaky nezastupují v regulárním výrazu žádné písmenko, nýbrž mají speciální význam 4/31
Znak ^ označuje začátek řetězce Příklad: ^cde Abcde x cdeab Co vyhovuje výrazu? 5/31
Znak $ Označuje konec řetězce Příklad: $cde Abcde x cdeab Co vyhovuje výrazu? 6/31
Znak. (tečka) Zastupuje libovolný znak Příklad: ^.luh$ pluh x dluh x dluhy Co vyhovuje výrazu? 7/31
Znak * označuje opakování předcházejícího znaku nula- a vícekrát Příklad: ^ab*$ a x ab x abb x abbb x aabb Co vyhovuje výrazu? 8/31
Znak + označuje opakování předcházejícího znaku jednou- a vícekrát Příklad: ^ab+$ ab x abb x abbb x a Co vyhovuje výrazu? 9/31
Znak? označuje opakování předcházejícího znaku nula- nebo jedenkrát (nepovinný výskyt) Příklad: ^ab?$ a x aab x ab x abb Co vyhovuje výrazu? 10/31
Znaky { } Závorky {min, max} označují opakování předchozího znaku v rozsahu minimální počet a maximální počet Při neudání maxima je horní hranice neomezena Případně {pocet} přesně udaný počet Příklad: ^ab{1-2}$ ab x abb x abbb x aabb Co vyhovuje výrazu? 11/31
Úkoly Zapište jakým způsobem lze pomocí {} nahradit znaky 1) * 2) + 3)? 12/31
Znaky [] zastupuje jeden znak ze seznamu v závorkách Zapište co je reprezentováno následujícími výrazy: ^a[bcd]$ ^[a-z]*$ ^[a-za-z]*$ ^[a-za-z0-9]*$ ^[1-9]?[0-9]$ 13/31
Znak ^ na začátku seznamu znamená negaci závorky zastupují jeden znak, který není na seznamu Příklad: ^[^0-9] b87b x 87bb Co vyhovuje výrazu? 14/31
Poznámka Jestliže chcete do seznamu přidat znak "^", nesmí být na prvním místě. Naopak znak "-" musí být buď na prvním místě nebo jako pravá mez nějakého intervalu. Znak "]" musí být také jako první hodnota v seznamu (před ním může předcházet pouze znak negace "^"). 15/31
Znak má význam logického OR Používá se ve spojení se znaky () 16/31
Znaky ( ) slouží k seskupení řetězce opakovací značky (*, +,?) se pak vztahují na celý obsah závorky, ne pouze na jeden znak Příklad: ^(abc)*$ abc x abcacb x abcabc Co vyhovuje výrazu? 17/31
Úkoly Co vyhovuje výrazům? 1. ^(b cd)ef$ 2. ^(a b)*c$ 3. (a b) 4. (0 1 2 3 4 5 6 7 8 9) 18/31
Znak \ převádí funkční znaky do nefunkční podoby ^.[$() *+?{\ "\." označuje znak "." "\\" označuje znak "\" 19/31
Kontrola emailové adresy Skládá se ze tří částí - jméno uživatele, zavináč ("@") a jméno serveru Jméno uživatele může obsahovat malá a velká písmena, číslice, tečky ("."), pomlčku ("-") a podtržítko ("_") Stejné znaky kromě podtržítka může obsahovat i jméno serveru Jméno uživatele ani jméno serveru navíc nesmí začínat ani končit tečkou a nikde se nesmí vyskytovat dvě tečky za sebou 20/31
Výraz pro ověření jména ^[_a-za-z0-9-]+$ Tento výraz však zatím nepovoluje tečku. 21/31
Výraz pro ověření jména vč. Tečky ^[_a-za-z0-9-]+(\.[_a-za-z0-9-]+)*$ 22/31
A ještě @ a jméno serveru Ve jméně serveru nesmí být podtržítko ^[_a-za-z0-9-]+ (\.[_a-za-z0-9-]+)* @[a-za-z0-9-]+ (\.[a-za-z0-9-]+)*$ 23/31
Úkol Jak upravíte výraz, pokud předpokládáme, že musí mít server alespoň dvě domény (tedy musí obsahovat alespoň jednu tečku)? 24/31
Úkol Jak upravíte výraz, pokud předpokládáme, že musí mít server alespoň dvě domény (tedy musí obsahovat alespoň jednu tečku)? ^[_a-za-z0-9-]+ (\.[_a-za-z0-9-]+)* @[a-za-z0-9-]+ (\.[a-za-z0-9-]+)+$ 25/31
Úkol Nejsprávnější odpovědí je: ^[a-za-z0-9_\+-]+ (\.[a-za-z0-9_\+-]+)* @[a-za-z0-9-]+ (\.[a-za-z0-9-]+)* \.[a-za-z]{2,4}$ Avšak za nějakou dobu již nemusí být aktuální 26/31
Třídy skupiny znaků přednastavené autory PHP syntaxe je [[:/trida/:]] 27/31
Seznam tříd alnum Písmena anglické abecedy a desítkové číslice alpha Písmena anglické abecedy lower Malá písmena anglické abecedy upper Velká písmena anglické abecedy digit Desítková čísla xdigit Šestnáctková čísla punct Interpunkční znaménka blank Tabulátor a mezera space Prázdné znaky (mezi prázdné znaky se nepočítá \n nový řádek) cntrl Řídící znaky (\n, \t apod.) print Tisknutelné znaky graph Tisknutelné znaky (bez mezery) 28/31
Metaznaky '[[:<:]]' resp. '[[:>:]]' označují začátek resp. konec slova. 29/31
Ukázka V praxi to znamená, že výrazu ^[[:xdigit:]]*$ vyhovuje jakékoliv šestnáctkové číslo 123, 13de8a, abc 30/31
Ukázka Regulárnímu výrazu [[:digit:]]{2} vyhoví řetězec obsahující dvoumístné číslo, tedy např. 54, ale i sdf78fd Častěji však budeme potřebovat zjistit zda řetězec obsahuje osamostatněné číslo, poté použijeme výraz [[:<:]][[:digit:]]{2}[[:>:]] Tomu tedy vyhoví např. řetězce 54 nebo sdf 78 fd. 31/31