Ersetzen Sie PHP-Templating-Variablen zwischen doppelten geschweiften Klammern, die in zweistelligen Code-Trennzeichen v

Post a reply

Smilies
:) :( :oops: :chelo: :roll: :wink: :muza: :sorry: :angel: :read: *x) :clever:
View more smilies

BBCode is ON
[img] is ON
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Ersetzen Sie PHP-Templating-Variablen zwischen doppelten geschweiften Klammern, die in zweistelligen Code-Trennzeichen v

by Anonymous » 01 Jan 2025, 23:45

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:

Top