Deprecated: Function create_function() is deprecated in /var/www/clients/client2/web3/web/www/wp-includes/pomo/translations.php on line 208

Deprecated: Function create_function() is deprecated in /var/www/clients/client2/web3/web/www/wp-includes/pomo/translations.php on line 208

Deprecated: Function create_function() is deprecated in /var/www/clients/client2/web3/web/www/wp-includes/pomo/translations.php on line 208

Deprecated: Function create_function() is deprecated in /var/www/clients/client2/web3/web/www/wp-content/themes/latte/inc/widgets/latte-services.php on line 109

Deprecated: Function create_function() is deprecated in /var/www/clients/client2/web3/web/www/wp-content/themes/latte/inc/widgets/latte-skills.php on line 82

Deprecated: Function create_function() is deprecated in /var/www/clients/client2/web3/web/www/wp-includes/pomo/translations.php on line 208

Deprecated: Function create_function() is deprecated in /var/www/clients/client2/web3/web/www/wp-includes/pomo/translations.php on line 208

Deprecated: Function create_function() is deprecated in /var/www/clients/client2/web3/web/www/wp-includes/pomo/translations.php on line 208
regexp Archives - Tahicz.cz
 

Tahicz.cz

Tvorba webů, svět WordPressu, php a internetu, pár triků a tipů, rad a kombinace toho všeho.

Kouzla s regulárními výrazy II


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

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

Funkce preg_replace_callback()

K čemu se tato funkce může asi tak používat? Funkci preg_replace zná asi každý. Vezmu řetězec, najdu v něm to, co se má podle nějakého vzoru najít, a to, co jsem našel, vrátím. Jednoduché.

Tato funkce dělá něco podobného s tím rozdílem, že je schopná rovnou nalezené řetězce zpracovávat/formátovat, nahrazovat upravovat vlastnosti chodu programu.

Ano, někdo může namítnout, že toto dělá i funkce preg_replace. A já musím potvrdit, že ano. Je to asi jako cyklus WHILE a FOR. Oba se dají zaměnit, libovolně prohazovat. Přesto se používají oba.

Zpět ale k funkci preg_replace_callback. Její praktické využití je třeba, když píšete nějakou šablonu a potřebujete na základě nějakých řídicích znaků, které mají určité parametry, vkládat nějaká předzpracovaná data. Nebo na základě toho, co najdete, inicializovat nějakou třídu, v ní provést nějaké informace a na základě toho vrátit nějaký výsledek.

Nejjednodušší bude napsat přímo příklad. Tady mám k dispozici kus šablony, která obsahuje řídicí příkaz $link a obsahuje parametr src.

 

Pomocí tohoto řídicího znaku by se měl řetězec nahradit odkazem někam do internetu. Napřed si ukážeme, jak by takové řešení mohlo vypadat s využitím metody preg_replace

Ano, toto řešení je hezké, jednoduché a krátké. Jak ale zajistit třeba nějaké formátování, např. u obrázku, kdy budumít obrázek zadaný do šablony jen adresou. Naprosto jednoduchým mechanizmem nahradím řídicí znaky tagem img a příslušnou adresou. To není těžké.

Co když ale budu chtít do titlu (nebo altu) přidat informaci o jeho velikosti, rozměrech, nebo kdy byl nahrán. Nebo má-li ten obrázek být klikací, aby se mohl zobrazit například v nějakém lightboxu?

To už tak jednoduše nepůjde udělat pomocí funkce preg_replace, a proto si zavoláme na pomoc funkci preg_replace_callback. Původní kus šablony si trochu upravíme a přidáme si tam parametr pro zobrazování obrázku do lightboxu.

 

PHP skript, který se bude starat o vykreslování by mohl vypadat nějak takhle:

České uvozovky v článku


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

Po dlouhé době jsem musel řešit zajímavý problém v regulárním výraze – jak nahradit anglické uvozovky českými. Klasická česká uvozovka je pomocí html entit zapsaná takto: „ a “ a jedná se o znaky „ a “. Většina lidí ale používá anglické uvozovky, tedy “ (").

Musím říct, správně prohodit tyto uvozovky v html dokumentu není zase tak jednoduché. Html značky totiž mohou obsahovat atributy a ty se standardně píší s „. Jak na to tedy? Rychlá a celkem účinná metoda jak je prohodit je použití regulárního výrazu. Lépe řečeno dvou výrazů.

První výraz najde text mimo tagy a druhý najde uvozovky. Pak už stačí správně text upravit a máme vyhráno.

Je zde využitá funkce preg_replace_callback, která umožňuje vytvoření vlastních pravidel při nahrazování dat pomocí regulárních výrazů.

Kouzla s regulárními výrazy


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í.