PHP: funktionierendes PHP aus einem PHP echo() heraus

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.

Code

Code anzeigen

<?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.

Demo

Demo

Download

echo-php-code [.zip]

Changelog


v1.1: Performance mit schneller strpos() Vorabfrage erhöht. Regex kommt jetzt nur noch zum Einsatz wenn im String überhaupt ein < ?php gefunden wird.

1 Kommentar

Schreibe einen Kommentar