Regex oder ähnliche Ersetzungsmöglichkeit - Denkanstoss gesucht!

Caralynn

Mitglied
Hallo,

seit längerem grübel ich nun über ein Problem, was ich bei einer kleinen Testapplikation mit PHP/OOP (im weitesten Sinne) habe.

Bei dieser Testapplikation handelt es sich um eine Kombination aus Template- und Sprachsystem, was textuell auf xml-Dateien basiert.

So weit, so gut - für jede Sprache wird nun also der Text aus der xml-Datei ausgelesen, was auch einigermaßen gut funktioniert.

Allerdings möchte ich nun in die xml-Dateien Platzhalter einfügen, an deren Platz später aus einer Session heraus gelesene Daten (Benutzername, Logindatum, etc. pp) angezeigt werden sollen.
Da ich im Hinterkopf eine Ersetzungsfunktion hatte bzw. bereits mit einer Ersetzungsfunktion für BB-Codes drüber gehe (bzw. eben fett, kursiv, was manchmal im Text ja doch ganz sinnvoll ist), dachte ich mir, dass { und } nette Begrenzungszeichen sind... aber so einfach scheint es nicht zu sein, da ich ja nicht "PHP-Code" in eine xml-Datei schreiben kann, ganz so engstirnig bin ich nicht :rolleyes:

Dachte an eine Art Textplatzhalter, der dann später durch eine Umsetzungstabelle eben ersetzt werden kann... nur mir fehlt irgendwie die zündende Idee, wie man das verwirklichen kann... Session-Klasse? Regex? Einfache Funktion?

Zum Aufbau noch: Beim Login wird momentan alles noch in einzelne Sessionvariablen gelegt, das möchte ich - sofern sinnvoll (ist es das? Ist es überhaupt möglich? ;)) - auch in ein Objekt einer Klasse ab- bzw. umschreiben, damit letztendlich ein Objekt in der Session gespeichert wird. Muss dazu sagen, dass ich schon lange nicht mehr daran herumgespielt habe und im Moment nicht mehr ganz durchsteige, von daher ist mir auch nicht ganz klar, welche Informationen noch für einen Denkanstoss sinnvoll wären :(

Noch einmal kurz: Es soll quasi der Platzhalter "{NICK}" in der XML-Datei letztendlich durch den Inhalt einer vorher registrierten Sessionvariablen bsp. "NoNick" ersetzt werden.

Viele Grüße,
Katharina
 
Hi,

so ähnlich arbeitet ein Minimal-Templatesystem, welches ich bei kleineren Projekten einsetze.

Der Kern ist zum einen ein assoziatives Array, in dem die zu ersetzenden Variablen abgelegt werden, z.B.:
PHP:
$vars = array("NICK"=>$_SESSION["user_nickname"], "DATE"=>date("d.m.Y"));

In meiner Template-Klasse (die auch Schleifen unterstützt, und daher als ganzes keinen Sinn macht, werden die Schlüsses des übergeben Arrays einfach per str_replace ersetzt:
PHP:
	foreach ($vars as $key=>$val) {
		$content = str_replace("{".$key."}", $val, $content);
	}
(wobei hier in $content der eingelesene html-Quelltext des Templates sitzt).

Wenn Du die Limiter "{" und "}" gleich in den Array-Schlüsseln mitnotierst, kannst Du Dir die Schleife auch sparen, und gleich array_keys() und array_values() in der str_replace-Methode einsetzen:
PHP:
$content = str_replace(array_keys($vars), array_values($vars), $content);

... mit regulären Ausdrücken bist Du natürlich um einiges flexibler, aber für den "Hausgebrauch" mit ich mit dieser Variante immer gut gefahren.

Gruß
.
 
Huhu Tobias,

danke für diesen Ansatz! :)
Die Idee mit dem assoziativen Array ist mir noch gar nicht gekommen, so kann das natürlich schön arbeiten und ich sehe jetzt endlich, was ich eigentlich für einen Benutzernamen habe ;-)
... und ich ärgere mich ein bisschen, ist ja doch eine simple Lösung *g*

Nichtdestotrotz würde mich interessieren, ob es auch möglich wäre, einen Regex dafür einzusetzen, da ich die unglaublich interessant finde ;) - allerdings habe ich mich mit der Thematik bis auf den bekannten Emailregex noch nie auseinandergesetzt (hatte mal eine gute Seite, wo das erklärt war, aber die ist mir beim Kaffeeunfall verloren gegangen)

Viele Grüße,
Katharina
 
Zurück