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.
1 |
<div class="layer">{$link src=odkaz}</div> |
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
1 2 3 4 5 6 |
$template = '<div class="layer">{$link src=odkaz}</div>'; $result = preg_replace('/{\$link[ ]?(src=(.*))?}/', '<a href="./$2">$2</a>', $template); echo $result; /** * <a href="./odkaz">odkaz</a> */ |
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.
1 |
<div class="layer">{$link src=obrazek.jpg lightbox=true}</div> |
PHP skript, který se bude starat o vykreslování by mohl vypadat nějak takhle:
1 2 3 4 5 6 |
$template = '<div class="layer">{$link src=obrazek.jpg lightbox=true}</div>'; $result = preg_replace('/{\$link[ ]?(src=(.*))?}/', '<a href="./$2">$2</a>', $template); echo $result; /** * <a href="./odkaz">odkaz</a> */ |