renephoenix.de

Ersetzungsfunktion

Mein bisheriger Ansatz zur Arbeit zu template-Dateien sah so aus:

$htmlfile = ereg_replace("\<\!--MENU--\>",menu ($connect, $cmd),$htmlfile);

  $htmlfile = ereg_replace("\<\!--CONTENT--\>",main ($connect, $cmd, $sp),$htmlfile);
  $htmlfile = ereg_replace("\<\!--TITLE--\>","Homepage von René Pönitz",$htmlfile);
  echo $htmlfile;

Ich lese die template-Datei ein, und ersetze die gewünschten Stellen mit einer Reihe von replace-Befehlen. Nun gab mir Gernot den Denkanstoß, daß diese Art und Weise sehr ineffizent ist. Das Durchsuchen der template-Datei am Anfang geht relativ zügig, da die Datei relativ klein ist. Doch bei jeder Ersetzung wird die auszugebende Seite immer größer — und das ist die Basis für die nächste Stufe. Zudem baut man sich ein kleines Sicherheitsloch ein. Angenommen in einer Stufe kann der Besucher Eingaben machen (z.B. in dem er einen Kommentar abgibt), und gibt dummerweise eine Zeichenfolge ein, nach der später noch gesucht wird. Möglicher Schaden wäre z.B. das ein Menu dann mehrfach erscheint.

In meinem speziellen Fall kann man diesem Phänomen auch mit htmlspecialchars() umgehen, da mein Erkennungszeichen eckige Klammern enthält. Es gibt jedoch auch Templatesysteme, die nur mit %wort% oder {code} arbeiten.

Zur Lösung des Problems erinnerte ich mich an einen nützlichen Hinweis von Thiemo: die Funktion strtr() erledigt alle Ersetzungen nebeneinander. Ein Beispiel aus dem PHP-Manual:

<?php
$trans = array("hello" => "hi", "hi" => "hello");
echo strtr("hi all, I said hello", $trans);
?>

Der Ergebnis sieht so aus: hello all, I said hi
Diese Idee baute ich nun um:

$trans = array( "<!--MENU-->" => menu ($connect, $cmd),
      "<!--CONTENT-->" => main ($connect, $cmd, $sp),
      "<!--TITLE-->" => "Homepage von René Pönitz"
  );

  $htmlfile = strtr ( $htmlfile, $trans );

Meßbare Verbesserungen sind durch die neue Variante zu spüren: mit der bisherigen Variante benötige ich auf einem 400MHz-Teil etwa 0.74 Sekunden.  Mit der Veränerung läd es die Seite im Schnitt 0.70 Sekunden.

Bisherige Kommentare (3)

Kommentar von Gernot

Am konformsten mit den X(HT)ML-Richtlinien wäre es ja, wenn du deine Ersetzungstags nicht als Kommentare, sondern als XHTML-Tags mit eigenem Namespace schreibst, also z.B. <rpoe: titele />

Kommentar von Gernot

Hey, die Akronym-Erklärfunktion ist ne echt gute Idee!

Sollte natürlich <rpoe: title /> heissen.

Damit kannst du den Platzhaltern evtl. sogar Attribute wie z.B. die Zahl der angezeigten Artikel mitgeben.

Kommentar verfassen

Freiwillige Angabe
Freiwillige Angabe
Der Text kann mit Textile formatiert werden, z.B. *fett* _kursiv_ "link":url. Wie das geht?
Wieviel ist 40 plus 2?

Bisherige Trackbacks (0)

Es wurde noch kein Trackback empfangen!