Wat ik probeer is een tpl parser te maken,

Deze moet de de tekst {t{naam}} omzetten naar

<?php echo $t['naam']; ?>

En dan kan ik daarna de eval functie gebruiken zodat alle variables netjes worden omgezet.

Wat ik tot nu toe heb is:
$tpl = preg_replace('#{t{([\w]*)}}#si', '<?php echo $###; ?>', $tpl);

Alleen op de plek van ### moet de juiste waarde komen.

Bij {t{naam}} is dat bijv naam
Bij {t{hello}} is dat bijv hello
Bij {t{world}} is dat bijv world

En dat komt ik helaas niet uit, heeft iemand misschien enig idee?

Alvast bedankt.

Je wilt die eval niet hebben, probeer zo min mogelijk gebruik te maken van eval. Je kunt kijken hoe bijvoorbeeld [google]smarty[/google] wel dit doet.
Met [php]preg_replace_callback[/php] kan je je [php]eval[/php] overslaan.
<?php

function template_callback($matches)
{
$varname = $matches[1];

return htmlentities($GLOBALS[$varname], ENT_QUOTES);
}

echo preg_replace_callback('#{t{([\w]*)}}#si', 'template_callback', $tpl);

?>
Karl schreef op 03.05.2009 21:23
Je wilt die eval niet hebben, probeer zo min mogelijk gebruik te maken van eval. Je kunt kijken hoe bijvoorbeeld [google]smarty[/google] wel dit doet.

Smarty gebruikt eval/include. Het zet het template om naar PHP-code (zoals bijna alle template parsers) en eval'ed het dan.
Richard van Velzen schreef op 03.05.2009 22:28
[quote='Karl schreef op 03.05.2009 21:23']Je wilt die eval niet hebben, probeer zo min mogelijk gebruik te maken van eval. Je kunt kijken hoe bijvoorbeeld [google]smarty[/google] wel dit doet.

Smarty gebruikt eval/include. Het zet het template om naar PHP-code (zoals bijna alle template parsers) en eval'ed het dan.[/quote]
Ah, bah, dus toch wel. Ik wist dat die het omzet in "normale" php code, dus dacht ik dat opzich dat wel een voorbeeld kon zijn, maar dat ie het evalt wist ik niet.
Als eerste wou ik eigenlijk geen eval gebruiken, is niet de meest veilige functies.

Gelukkig is het nu gelukt met de oplossing van Jelmer, en zonder eval(). Bedankt!

Dit is het script uiteindelijk geworden:

<?php
function t_callback($matches)
{
global $t;
return $t[$matches[1]];
}

function t($tpl)
{
$tpl = file_get_contents($tpl);
$tpl = preg_replace_callback('#{t{([\w]*)}}#si', 't_callback', $tpl);

return $tpl;
}
?>

Wat je nu kan doen is een tpl bestand inladen.
$tpl = file_get_contents('pad/naar/bestand.tpl');
daarna kan je de functie t() er over heen laten gaan
$tpl = t($tpl);

En dan word dit: {t{variable_naam}} in het tpl bestand
vervangen met globale array $t.

Een erg simpel systeem voor het gebruik voor meerdere talen.

Bedankt allemaal.

Reageren