Per sostituzioni così semplici, a mio avviso l'uso di str_replace() è SEMPRE conveniente. Questo il mio listato adattato (occhio che ho dovuto doppioslashare l'espressione regolare perché mi mangiava un backslash):
Codice PHP:
<?php
$template = '
<html><head><title>template</title>
</head>
<body>
Sicuramente i
ameranno la
</body>
</html>';
$template_eval = '$_tmp = "
<html><head><title>template</title>
</head>
<body>
Sicuramente i $name
ameranno la $pippo
</body>
</html>";';
function parse_eval($template) {
$name = 'fagiani';
$pippo = 'pillola';
eval($template);
echo $_tmp;
}
function parse_preg($template) {
$name = 'fagiani';
$pippo = 'pillola';
echo preg_replace('/()/e', '$$2', $template);
}
function parse_replace($template) {
$name = 'fagiani';
$pippo = 'pillola';
foreach(get_defined_vars() as $_name => $_value) {
$template = str_replace('', $_value, $template);
}
echo $template;
}
$start = microtime(true);
//echo parse_eval($template_eval);
for ($n=0; $n<100000; ++$n) {
ob_start();
parse_eval($template_eval);
ob_end_clean();
}
$t = microtime(true) - $start;
echo "parse_eval: $n cicli in $t secondi\n";
$start = microtime(true);
//echo parse_preg($template);
for ($n=0; $n<100000; ++$n) {
ob_start();
parse_preg($template);
ob_end_clean();
}
$t = microtime(true) - $start;
echo "parse_preg: $n cicli in $t secondi\n";
$start = microtime(true);
//echo parse_replace($template);
for ($n=0; $n<100000; ++$n) {
ob_start();
parse_replace($template);
ob_end_clean();
}
$t = microtime(true) - $start;
echo "parse_replace: $n cicli in $t secondi\n";
?>
Ho eseguito una serie di test usando eval(), preg_replace() e str_replace(): in realtà preg_replace() risulta sensibilmente più lenta in tutti i test (a meno che qualcosa mi sfugga). Comunque, questi i risultati (PHP 5.2.4 CLI):
codice:
parse_eval: 100000 cicli in 1.2966370582581 secondi
parse_preg: 100000 cicli in 1.8667900562286 secondi
parse_replace: 100000 cicli in 1.0892291069031 secondi
str_replace() è la più rapida.
Di più, ho modificato i templates per far stampare entrambi i tag tre volte e vedere come si comporta con ripetizione di tags:
codice:
parse_eval: 100000 cicli in 1.8374869823456 secondi
parse_preg: 100000 cicli in 3.9160349369049 secondi
parse_replace: 100000 cicli in 1.3093018531799 secondi
Si può notare che il rendimento di parse_preg() è crollato.
Ho aggiunto più variabili da sostituire (6):
codice:
parse_eval: 100000 cicli in 1.9696319103241 secondi
parse_preg: 100000 cicli in 4.4429740905762 secondi
parse_replace: 100000 cicli in 2.5497419834137 secondi
Il rendimento di parse_replace() è crollato.
Ho aggiunto ai templates 400 bytes di testo statico da NON sostituire:
codice:
parse_eval: 100000 cicli in 3.8357100486755 secondi
parse_preg: 100000 cicli in 4.7148230075836 secondi
parse_replace: 100000 cicli in 2.9533319473267 secondi
Il rendimento di parse_eval() è crollato.
Conclusione? Ognuno si scelga il metodo più idoneo alle sue necessità. L'unica cosa certa è che, almeno sul mio PC e con il PHP 5.2.4 (e nella forma adottata), il parsing con preg_replace() ha avuto i risultati peggiori in ogni prova.