[PHP] String parsen

AMD-Hammer

Grand Admiral Special
Mitglied seit
05.10.2003
Beiträge
2.760
Renomée
123
Standort
Bornheim (Rheinland)
Hallo zusammen,

ich arbeite derzeit an einer Art Template Engine in PHP. Diese greift Templatedateien zu liest diese Zeile für Zeile aus und ersetzt die Platzhalter durch die korrekten Werte.

Nun ist jedoch ein problem bei dynamischen Navigationsleisten. Diese können ja nicht starr vorgegeben sein. Daher wird an dieser Stelle ein entsprechende Schleife (while oder for) eingesetzt. Das funktioniert soweit auch alles prächtig nur ist das Problem, dass ich ja jetzt Code in den Ausgabestring geschrieben habe und dieser nicht nochmal vom PHP-Parser interpretiert wird.
Ich meine mich zu erinnern, dass es eine Funktion gibt, mit der man einen String parsen lassen kann, aber der Name will mir absolut nicht einfallen und Google war bisher eher weniger hilfreich.

Nochmal zum verdeutlichen. In dem String den ich am Ende des Scriptes ausgebe steht PHP Code drin, der nochmal verarbeitet werden muss und anstatt, dass er dies tut verschwindet der code halt einfach und ist weder auf dem Bildschirm noch im HTML Quellcode der Seite zu finden.

Ich hoffe ihr könnt mir helfen und vor allem hoffe ich ihr habt verstanden, was ich überhaupt suche ;)

Danke schonmal :)

P.S.: Wenn ich den string in eine temporäre Datei schreibe und diese dann includiere funktionierts, aber das ist nicht wirklich akzeptabel, da der Server damit ja andauernd mit dem schreiben von temp daten beschäftigt wäre und das imho nicht sonderlich gesund ist.
 
Okay, dann hier mal nen bisschen pseudo code (denn die inzwischen 780Zeilen Code würden wohl den Rahmen sprengen).

Der String der im Endeffekt aus der Generierung hervorgeht sieht so in etwa aus:
PHP:
<html>
<head>...</head>
<body>
text text text
<ul>
<?php for($i = 0; $i <= 3; $i++) { ?>
<li>
  <a href="link.html">Linkname</a>
</li>
<?php } ?>
</ul>
Und das Problem ist halt, dass er das "for" nicht weiter interpretiert sondern einfach ignoriert (wird wie gesagt weder im code noch auf dem bildschirm angezeigt).

Mit eval hab ich gerade schon nen bissel rumgespielt, aber wenn irgendwie funktioniert das net so ganz. Wenn wir mal davon ausgehen das die variable in der der obere code drin steht $output heißt, dann hab ich es so mit eval probiert.
PHP:
eval ("\$output = \"$output\";");
echo $output;

Allerdings bekomme ich dann nur die Fehlermeldung:
Parse error: syntax error, unexpected '<' in /datei.php(80) : eval()'d code on line 3
 
Ja, weil Du mit dem ?> das PHP ja zumachst, das wirft alles aus der Bahn. Du könntest das escapen, aber das wird imho zu fitzelig. Lass doch innerhalb des Strings lieber die php-Tags weg und schreib die HTML-Anweisungen in Echos. D.h. man schreibt PHP-Code mit HTML-Schnipseln drin statt HTML-Code mit PHP-Schnipseln.

Also
PHP:
echo "<html>
<head>...</head>
<body>
text text text
<ul>";
for($i = 0; $i <= 3; $i++) { 
echo "<li>
  <a href='link.html'>Linkname</a>
</li>";
 } 
echo "</ul>";
Mußt dann natürlich innerhalb des HTML-Kontextes die Anführungsstriche durch Apostrophe ersetzen, sonst beendest Du ja das echo.
 
Zuletzt bearbeitet:
Bitte was?

Der Interpreter hört gar nicht bei ?> auf zu parsen, sondern geht das ganze Dokument durch.

Man sollte es nur nicht machen, weil es sonst nicht sehr gut lesbar ist.

@AMDHammer
Dein Fehler muss wo anders sein. Hab mal dein Snipplet gerade getestet und die Schleife wird abgearbeitet.

Von wo kommen denn die Wert von $i?

Btw: Schau Dir mal die Smarty-Template-Engine an unter http://smarty.php.net
Warum immer das Rad neu erfinden???
 
Zuletzt bearbeitet:
@Bitspyer
Wo der Wert $i herkommt? Den definier ich doch in der for-schleife. das war nur ein beispiel.
Ich weis, dass es Smarty schon gibt und das smarty auch recht mächtig ist, aber da ich die engine für mein cms nutzen werde will ich da nicht so was aufgeblasenes wie smarty einsetzen. So kann ich halt die Engine an das CMS anpassen und nicht andersrum.

Wie hast du denn den Snipplet getestet?
@ OBrian
Ich werd das mal ausprobieren, aber ich hab eigentlich schon fast aus der not eine tugend gemacht.

Statt jedesmal den php-interpreter schufften zu lassen, wenn die Seite generiert wird, wird die seite einfach lokal als temp file gespeichert und erst nach bestimmter zeit (zB einer Woche) bzw. sobald sich etwas in der Datenbank verändert neu generiert, bzw gelöscht. Damit sinkt dann der SQL Traffic und die Last die der PHP Interpreter erzeugt um einiges ab. Und da ich das geschriebene file dann einfach per include einbinden kann wird es auch nochmal durch den interpreter gejagt und *TADA* schon funktionierts. :)
 
Ich hab Deinen Code 1:1 kopiert, noch ein </body> und </html> dran gehängt durch meinen Webserver gejagt. (Apache2 mit php5)

Ja und wegen $i... Kurzer IRQ Aussetzer... ;)
 
Zuletzt bearbeitet:
Ich hab Deinen Code 1:1 kopiert, noch ein </body> und </html> dran gehängt durch meinen Webserver gejagt. (Apache2 mit php5)

Ja klar, dann funktioniert der Code sauber. Das Problem is aber, dass der Code generiert wird. Das heißt das was du da siehst is das was rauskommt, nachdem der Interpreter das erste mal drüber gelaufen ist. Wenn du das nochmal durch den Interpreter jagst (was du ja machst, wenn du den quellcode 1:1 kopiert hast), dann wird die schleife sauber ausgeführt.

Die Sache ist wie kann ich ihm sagen, dass er den Code (siehe oben) der in der variable $output steht nochmals durch den interpreter schicke.
 
Zurück
Oben Unten