Ich arbeite an einer benutzerdefinierten, minimalistischen PHP-Vorlagen-Engine für den Einsatz in persönlichen Projekten. Ich muss herausfinden, wie ich mithilfe eines regulären Ausdrucks einige Ersetzungen vornehmen kann. Ich habe diese Zeichenfolge:
Code: Select all
$string = 'sometext {% {{ var1 }} middletext {{ var2 }} %} moretext {{ varx }} {% {{ var3 }} %}';
Ich möchte alle Variablen zwischen {{ }}-Trennzeichen durch ihr PHP-Äquivalent ersetzen, aber nur, wenn sie innerhalb von {% %}-Trennzeichen verschachtelt sind
Dies ist die gewünschte Ausgabe:
Code: Select all
sometext {% $var1 middletext $var2 %} moretext {{ varx }} {% $var3 %}
Bisher habe ich Folgendes versucht:
Code: Select all
echo preg_replace('#\{\{\s*(.*?)\s*\}\}#', '\$$1', $string);
Ich habe diesen Regex sogar mit Lookaheads ausprobiert:
Code: Select all
echo preg_replace('#(?=.*\{%?)\{\{\s*(.*?)\s*\}\}(?=.*%\})(?!=.*\{%.*%\})#', '\$$1', $string);
Aber in beiden Fällen erhalte ich die gleiche Ausgabe: Alle Variablen in der Zeichenfolge werden ersetzt, unabhängig davon, ob sie sich innerhalb von {% %}-Trennzeichen befinden oder nicht (beachten Sie, dass $varx auch unerwünschterweise ersetzt wird). , meine falsche Ausgabe ist:
Code: Select all
sometext {% $var1 middletext $var2 %} moretext $varx {% $var3 %}
Ich habe es gelöst und die gewünschte Ausgabe erhalten, indem ich foreach-Schleifen verwendet habe, um zuerst {% %}-Trennzeichen abzugleichen und dann die Variablen in der Zeichenfolge durch die Verwendung von Arrays in preg_replace() zu ersetzen, z. B dies: