PHP-Tags entfernen

rellek

relativ sensationell
Teammitglied
Hallöchen,

ich arbeite gerade so ein kleines bisschen an etwas, was sowas ähnliches wird wie ein Template-System.
Das soll etwas mehr können als nur stur HTML ausgeben, deshalb ists etwas komplexer. Funktioniert soweit aber.

PHP ist jedoch böse, wie wir alle wissen. 😀 Und deshalb hätte ich gerne die PHP-Tags, die ein Benutzer da reinzufummeln versucht, gekillt.
Da PHP-Tags sein können <?php ... ?> und in älteren Versionen auch <? ... ?>, haben wir ein Problem: Blöderweise fangen XML-Dateien (etwa RSS-Feeds) auch mit <? an. Genauer gesagt mit <?xml
Versucht habe ichs mit:
PHP:
$tmp = preg_replace('/<\?^(xml)(.*)\?>/Uis', '', $tmp);

Das funktioniert aber nicht. Der lässt nun sowohl <?xml als auch <?php als auch <? drin.

Hat jemand eine Idee?
 
PHP:
$tmp = preg_replace('/(<\? |<\?php)(.*)\?>/Uis', '', $tmp);
war ^ in der pattern für "anfang"? nur in der [^ 0-9] ist das ne negierung, ob man da aber auch strings ausnehmen kann?

bin da aber grad auch etwas aus der Übung
 
Hm also auf dieser krassen Seite:
http://www.zytrax.com/tech/web/regex.htm
steht:
Anhang anzeigen 129

Deshalb dacht ich, man könne so negieren.

Danke für deine Lösung - sie funktionierte noch nicht 100% aber hat mich auf die richtige Fährte gelockt.
Das Problem ist, dass nach <? kein Leerzeichen folgen muss, sondern auch ein Zeilenumbruch. 😛inch: Das behebt die Klasse der Whitespaces aber:
PHP:
$tmp = preg_replace('/((<\?\s)|(<\?php))(.*)\?>/Uis', '', $tmp);

Sieht gruselig aus, funktioniert aber. 😀
 

Anhänge

  • regex-not.png
    regex-not.png
    4,9 KB · Aufrufe: 53
so vielleicht?
PHP:
$tmp = preg_replace('/<\?(\s|php)(.*)\?>/Uis', '', $tmp);

BTW krasse Seite
The ^ (circumflex or caret) inside square brackets negates the expression (we will see an alternate use for the circumflex/caret outside square brackets later), for example, [^Ff] means anything except upper or lower case F and [^a-z] means everything except lower case a to z.

The ^ (circumflex or caret) outside square brackets means look only at the beginning of the target string, for example, ^Win will not find Windows in STRING1 but ^Moz will find Mozilla.

ich kenne die verwendung jedenfalls nur zu beginn einer Pattern, nicht aber mittendrin - da XML aber defintiv nicht am anfang steht hat es deswegen nicht funktioniert
 
Ah, super. Sieht nicht mehr ganz so gruselig aus und funktioniert.

Danke! 🙂

@ krasse Seite
Jaja der Firefox. Strg+F, gesucht, gefunden, ging nicht. 😀
 
Für die Nachwelt:
Habe den Spass noch etwas gepimpt, weil bei PHP der schliessende Tag nicht unbedingt notwendig ist, wenn nur noch PHP bis zum Fileende kommt...
PHP:
$tmp = preg_replace('/<\?(\s|php)(.*)(\?>|\z)/Uis', '', $tmp);

\z ist zwar "Stringende" und nicht EOF, aber das ist in meinem Fall dasselbe 🙂
 
Zurück
Oben