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$ ^(a|b)*c$ (a|b) (0|1|2|3|4|5|6|7|8|9)
2. 3. 4.
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