26-08-2011 00:00 - Zdroj: php.vrana.cz
Pro vygenerování HTML kódu ve webové aplikaci obvykle používám šablony, konkrétně Latte. Někdy je to ale zbytečně těžký kalibr a úplně by mi stačilo v textu nahradit pár proměnných. Něco jako sprintf, ale s tím, že by proměnné byly pojmenované.
K tomu se dá použít funkce preg_replace_callback, pomocí které vyhledáme proměnné v určitém formátu a nahradíme je na základě pole s definovanými hodnotami.
Řešení v PHP 5.3
PHP 5.3 nám díky anonymním funkcím nabízí elegantní řešení. Funkci pro záměnu můžeme definovat přímo při volání a můžeme jí určit, že může používat pole s hodnotami.
<?php
/** Náhrada proměnných v řetězci
* @param string řetězec $abc se nahradí za proměnnou, $$ za dolar
* @param array ('abc' => 'hodnota')
* @return string
*/
function replaceVariables($template, $variables) {
return preg_replace_callback(
'~\$([a-z_][a-z0-9_]*|\$)~i',
function ($match) use ($variables) {
if ($match[1] == '$') {
return '$';
}
return $variables[$match[1]];
},
$template
);
}
echo replaceVariables('Hello $name!', array('name' => 'World'));
?>
Řešení v PHP 5
V PHP < 5.3 si s funkcí nevystačíme a musíme definovat třídu, která si hodnoty uloží do pomocné vlastnosti:
<?php
class VariablesReplacer {
protected $variables;
private $string;
function __construct($template, $variables) {
$this->variables = $variables;
$this->string = preg_replace_callback(
'~\$([a-z_][a-z0-9_]*|\$)~i',
array($this, 'replace'),
$template
);
}
function __toString() {
return $this->string;
}
protected function replace($match) {
if ($match[1] == '$') ... -
Pokračovat...