PHP Regex: Ungenutzte Template-Tags entfernen, außer zwischen <script* und </script>

lordfritte

Lieutenant
Registriert
Juli 2006
Beiträge
965
Hallo,

ich verwende eine ganz einfache Template-Engine "str_replace und einfache Tags: {tag1}" und möchte am Ende einer Template, die nicht ersetzten Template-Tags aufräumen.

Dazu benutze ich preg_replace:
PHP:
$html = preg_replace("/\{\S+\}/", "", $html);

Das Problem: Das zerschießt mit json in einem Javascript, daher die Frage: Wie kann ich alle {S+} ersetzen außer diese stehen zwischen "<script*" und "</script>"

Ich habe schon dies versucht:
PHP:
$html = preg_replace("/(?!<script){\S+\}(?!<\/script>)/is", "", $html);
Aber es wird trotzdem alles innerhalb Javascript ersetzt.
 
Gar nicht. Javascript hat in einem Template eigentlich nichts zu suchen und regex ist nicht dafür da, HTML zu parsen.

Wenn es warum auch immer anders nicht möglich ist, dann mach 2 templates draus, eines mit HTML und eines _nur_ mit dem javascript-teil. Das Javascript template bindest du dann einfach mit include() ein anstatt es durch dein templatingscript zu jagen.
 
Naja....
Auf jeden Fall dies funktioniert:
preg_replace("/(?<!<[\s]script){\S+}(?![^<]*<[\s]\/[\s]script[\s]>)/i", '', $content);
....
 
..und wenn du in 2 monaten irgendwas daran ändern willst, oder die funktionialität erweitern oder was auch immer wirst du keine ahnung mehr haben, was der regex macht. du machst es dir mit deiner variante nur selber schwer.

abgesehen davon sind weder html noch javascript reguläre sprachen, somit hat regex da nichts verloren (vom unnötigen rechenaufwand mal abgesehen)

https://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags

Deine Lösung mag zwar für jetzt funktionieren, verstößt aber gegen jegliche best practice.
 
Zurück
Oben