Notice: A non well formed numeric value encountered in /var/www/clients/client2/web3/web/www/wp-content/plugins/crayon-syntax-highlighter/crayon_formatter.class.php on line 118

Notice: A non well formed numeric value encountered in /var/www/clients/client2/web3/web/www/wp-content/plugins/crayon-syntax-highlighter/crayon_formatter.class.php on line 119

Notice: A non well formed numeric value encountered in /var/www/clients/client2/web3/web/www/wp-content/plugins/crayon-syntax-highlighter/crayon_formatter.class.php on line 118

Notice: A non well formed numeric value encountered in /var/www/clients/client2/web3/web/www/wp-content/plugins/crayon-syntax-highlighter/crayon_formatter.class.php on line 119

Co to regulární výraz je?

Ve zkratce se dá říct, že regulární výraz (anglicky regular expression, regexp) je řetězec znaků (taková maska, vzor), která popisuje, jak má vypadat struktura určitých dat. Často se s takovým regulárním výrazem potkáte i v běžném životě. Typicky je to vzor pro zápis data (například do formuláře na internetu) – YYYY/MM/DD. Tento tvar říká, že datum máte zapsat jako rok/měsíc/den. Y zde zastupuje první písmeno anglického slova year – rok a čtyři Y po sobě znamená, že se má letopočet zapsat v jeho čtyřciferné podobě, například 2014. Obdobně je to pak pro písmena M (z anglického month – měsíc) a D (z anglického day – den).

Regulární výrazy jsou mocní pomocníci ve světě programování a práce s daty. Mají jednoduchou syntaxi zápisu a i ve velkých a složitých řetězcích znaků jsou velmi efektivní.

Syntaxe regexpů

Syntaxe je, jak už jsem psal, velmi jednoduchá. Posuďte sami:

  • ^ – začátek řetězce
  • $ – konec řetězce
  • . – libovolný znak včetně \n bez /
  • [] – výčet znaků
  • [^] – negativní výčet znaků
  • – rozsah znaků
  • () – podvýraz
  • | – logické NEBO
  • ? – žádné nebo jedno opakování
  • * – libovolné opakování
  • + – jedno nebo více opakování
  • {min,max} – opakování od–do
  • {3} – přesný počet opakování

Jak vidíte, zápis regexpů je opravdu jednoduchý. Je dobré vědět, že takto zapsané výrazy jsou strašně líné. Tzn., že pokud hledáte řetězec, který je ohraničený závorkami a v prohledávaném textu je jich několik, vezmou vždy jen první shodu. Takže ne text mezi první otvírací závorkou a poslední.

Co se vlastně dá s regulárními řetězci dělat?

Vlastně cokoliv, na co si člověk vzpomene a co jde dělat s řetězcem znaků – hledat, nahrazovat, dělit, přehazovat. Na většinu těchto činností existují v php funkce.

Právě kouzly s těmito funkcemi se zde budu zabývat. Nastudovat v dokumentaci php, jak se s regulárními výrazy pracuje, není těžké, ale občas není tak jednoduché odhalit některá kouzla a triky, které vám ulehčí život.

Funkce preg_match()

Funkce preg_match slouží primárně pro hledání shodných řetězců (případně podřetězců) znaků. Je to velmi užitečná funkce, pokud potřebujete ověřit třeba správnost zadaného e-mailu nebo potřebujete rozlišit několik typů různých nebo podobných souborů ve složce.

Zápis funkce vypadá asi takto:

Toto je běžné chování funkce preg_match a není na tom nic divného. Zajímavé věci se budou dít, když před hledaný řetězec přidáme ?P<text> a celý takto vzniklý řetězec uzavřeme do závorek.

Co se stane? Funkce preg_match vrátí výsledek jako směs asociativního pole a indexovaného. Viz ukázka níže.

Každý, kdo má aspoň trochu fantazie a chce si trochu ušetřit práci do budoucna, tuto možnost ocení. Parsování velice podobných dat není nic neobvyklého v programátorské praxi a pamatovat si, že na pozici 0 je tato hodnota a na pozici 1 je jiná, ale podobná té první, je dost složité. A pokud k takto vytvořenému kódu sednete po půl roce, už si ani nevzpomenete na charakteristiku těchto dat.

Když si ale člověk hezky pojmenuje klíče v asociativním poli, bude po půl roce aspoň tušit, jaká data, s jakým významem, jakým tvarem a typem se vlastně v této proměnné objevují.