PHP preg_replace mit Capture Groups und variabelen Variablen

Gsus

schwankend^^
ID: 215354
L
22 Mai 2006
1.553
68
Hallo,

mal wieder ein hoffentlich kleines Problem von mir:
Ich möchte ein Templatesystem basierend auf einer Templateklasse realisieren. Innerhalb der Templates sollen dann Variabelen wie {var} auftauchen, welche dann mittels preg_replace auf den jeweils gültigen Wert gesetzt werden sollen.

Mein Anfang sieht bisher so aus:
PHP:
echo preg_replace("/\{([a-z0-9]+)\}/", "$1", $string)."<br />";
Nun werden die Klammer {} weggeschnitten und es belibt nur der Name der Variabelen übrig.

Da ich aber nicht den Namen der Variablen, sondern den Inhalt der PHP-Variablen haben möchte, habe ich es mit einer variablen Variablen probiert:
PHP:
echo preg_replace("/\{([a-z0-9]+)\}/", "$$1", $string)."<br />";
Die Ausgabe ist nun allerdings "$var" und nicht der Inhalt selbiger Variablen.

Auch mit Klammern a la:
PHP:
echo preg_replace("/\{([a-z0-9]+)\}/", "${$1}", $string)."<br />";
oder ohne Hochkommata a la:
PHP:
echo preg_replace("/\{([a-z0-9]+)\}/", $$1, $string)."<br />";
geht es nicht, da ich dann eine Fehlermeldung bekomme:
Parse error: syntax error, unexpected T_LNUMBER, expecting T_VARIABLE or '$' in

Ich denke, dies liegt daran, dass 1 kein gültiger Variablenname ist. Der nächste Ansatz waren also named capture groups, damit bekomme ich dann aber leider weder Fehler, noch irgendeine sontige Ausgabe ;)
Der Versuch sah folgendermaßen aus:
PHP:
	echo preg_replace("/\{(?<var>[a-z0-9]+)\}/", $$var, $string)."<br />";

Ich hoffe ich habe mich verständlich ausgedrückt und mir kann jemand helfen :D

Vielen Dank schonmal im Vorraus!

mfg
Gsus
 
Guck Dir mal den Modifier "e" an, damit sollte das zu lösen sein.

[edit]

Hab's mal getestet und es klappt wie gewollt:
PHP:
<?
$text = '{foo} = {bar}';
$foo  = '1 + 2';
$bar  = 3;

echo preg_replace('/\{(\w+)\}/e', '$$1', $text);
 
Zuletzt bearbeitet:
preg_replace_callback() kann auch noch eine Alternative sein.
 
Guck Dir mal den Modifier "e" an, damit sollte das zu lösen sein.

vielen dank, damit hat es tatsächlich funktioniert ;) hättest du vielleicht auch noch eine möglichkeit mit named capture groups? nur mal um zu sehen, wie das system so funktioniert :D

gibt es nun vielleicht auch noch eine Möglichkeit auf diese art und weise nur bestimmte variabelen zu ersetzen, die in einem Array stecken?

oder muss ich dann das array per foreach durchlaufen und jede variable "einzeln" ersetzen?

mfg
Gsus
 
Solche komplexen Dinge sollte man dann doch über preg_replace_callback() lösen, wie theHacker schon andeutete.

Die Funktion bekommt die (Named) Capture Groups als Array übergeben.

Ich habe das obere Beispiel mal zur Verdeutlichung angepasst:
PHP:
<?
$template  = '{foo} = {bar}';
$variables = array(
    'foo' => '1 + 2',
    'bar' => 3,
);

$callback = function ($match) use ($variables) {
    return $variables[$match['var']] ?: $match[0];
};

echo preg_replace_callback('/\{(?P<var>\w+)\}/', $callback, $template);