Letztens habe ich über ein auf PHP Arrays basierendes Mehrsprachigkeitssystem bei Webseiten gesprochen.
Einer der Nachteile bei diesem System ist, dass jeglicher Webseiteninhalt in die Seite ge‘
echo
‚t wird. Möchte man jetzt interaktive PHP Inhalte auf die Seite bringen, wird es kompliziert.
Denn durch
echo
ausgegebene Inhalte werden einfach nur wiedergegeben, nicht noch einmal verarbeitet. Das führt dazu, dass durch
echo
ausgegebene PHP Codezeilen einfach ignoriert bzw. auskommentiert (Chrome) werden.
Beispiel:
<?php $string='Dies <?php echo("ist ein"); ?> Test!'; echo($string); ?>
Ausgegeben wird:
Dies Test!
Der PHP Code wurde ignoriert.
Lösung:
Ich habe eine Funktion geschrieben, mit der PHP Code selbst durch ein
echo
noch funktioniert.
Der Funktion wird ein Text übergeben, der sowohl einfach nur ausgegeben werden soll, als auch PHP Code enthält, der ausgeführt werden soll. Die Funktion teilt einfachen Text und PHP Code auf, gibt den Text normal aus und führt den PHP Code aus.
<?php $arr['a']='dies <em>ist <?php echo("ein");?> test</em> und gleich <?php $test="<b>noch ein"; $mark="!!"; echo($test." test".$mark); ?></b> <hr /> ja ja, so geht das'; function printcontent($page) { if(strpos($page,"<?php")!==false) { $temp = split("(<\?php|\?>)",$page); for($i = 0; $temp[$i]; $i++) { if(strrpos($temp[$i],";")>=strlen($temp[$i])-3) { echo(eval($temp[$i])); } else { echo($temp[$i]); } } } } ?> <html> <body> <?php printcontent($arr['a']); ?> </body></html>
Usage:
<?php printcontent($string); ?>
Wobei $string eine Zeichenkette ist, die einen
< ?php ... ?>
Part enthält. Wichtig ist, dass ihr tatsächlich mit
< ?php
beginnt, nicht nur
< ?
und dass das
?>
spätestens 3 Zeichen nach dem letzten Semikolon der letzten PHP Zeile kommt. So wird jeder PHP Part erkannt.
Setzt ihr also vor dem abschließendem
?>
5 Absätze oder Leerzeichen schlägt die korrekte Interpretation fehl.
v1.1: Performance mit schneller strpos() Vorabfrage erhöht. Regex kommt jetzt nur noch zum Einsatz wenn im String überhaupt ein < ?php gefunden wird.
echo „Die Zeit: „.time().“ Test“;