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
Články o programování v jazyku php
 

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:

Batch – chyba AJAXu


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

Pracujete s Drupalem? Používáte jeho vlastnost BATCH? Stává se vám, že se tato chyba velmi často objevuje bez zjevné příčiny? Mně ano.

Už cca tři čtvrtě roku musím pracovat s Drupalem. Pro něj píši modul, který má pracovat v dávce se vstupními daty, nějak je „přechroustat“ a uložit jako node. Nic moc složitého.

U mě to má několik úskalí:

  1. jednotlivé dávky mají několik desítek prvků
  2. dávek je několik set
  3. průměrné zpracování jednoho prvku trvá cca 15s

Brutální data, že? Když uvážím, že to pouštím na celkem silném stroji, celkem mě mrazí po zádech a mám pochybnosti o kvalitě a výkonnosti Drupalu.

Nicméně tento článek nepíši jako kritiku na Drupal, ale protože jsem narazil na problém s batchem.

Při spuštění výše zmíněných dávek se mi v naprosto nepravidelných a náhodných cyklech objevovala tato chyba:

Bohužel se mi nepovedlo zjistit, co s tím. Nakonec mě zachránil jiný problém. Ten řešil všeobecně nefunkční batch. Spásná myšlenka toho článku byla nastavit 3 serverové hodnoty na neomezeně.

Jedná se o:

  • memory_limit = -1
  • max_input_time = -1
  • max_execution_time = 0

Jedná se o celkem mocné nastavení. Nicméně pozor! V produkčním prostředí webu není dobré mít tyto hodnoty nastavené na neomezené hodnoty.

V režimu vývoje a plnění systému daty jsou to ale neocenitelní pomocníci. Nevím přesně, jak batch funguje (podle mě se dost liší realita od toho, co má Drupal napsáno na webu). Ale jen díky tomuto nastavení běží bez pádů a problémů třeba pro 35 000 položek v kuse.

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