Problem mit preg_replace und Verschachtelung
muenzchen
- php
Hallo,
ich experimentiere gerade etwas mit preg_replace und BBCodes herum und bin dabei jetzt auf ein Problem gestoßen.
Das ist mein Pattern für fett geschriebenen Text: "~[B](.*?)[/B]~i"
Gibt der Benutzer jetzt aber [B][B]Text[/B][/B] werden nur die äußeren Tags ersetzt, nicht aber die inneren. Wie kann man denn dieses ein Problem geschickt umgehen ohne str_replace für den jeweils öffnenden und schließenden Tag zu verwenden?
MfG, muenzchen
Hallo muenzchen!
Schau mal hier:
8.13. Hilfe, mein Regulärer Ausdruck frißt zuviel!
http://www.dclp-faq.de/q/q-regexp-gierig.html
Danke, aber ich glaube nicht, dass das das Problem ist. preg_replace nimmt beim drüberlaufen die ersten beiden äußeren Tags und ersetzt sie, dadurch werden weitere gleichartige Tags innerhalb der ersetzten Tags aber nicht mehr ersetzt. Ich weiß aber nicht wie ich das mit diesem ungreedy lösen könnte, denn im Prinzip müsste preg_replace ja von innen nach außen suchen damit alles ersetzt wird.
Hi,
Ich weiß aber nicht wie ich das mit diesem ungreedy lösen könnte,
kannst Du nicht. Regular Expressions sind nicht für Strukturen geeignet.
Cheatah
Hey muenzchen,
Verschachtelte reguläre Ausdrücke gibt es - in Perl! Mit der libpcre,
wie sie in PHP verwendet wird, kannst du sowas nicht machen. Wie du
schon richtig erkannt hast, bleibt dir also nichts anderes übrig, als
die Ersetzungsfunktion mehrmals aufzurufen - oder via /.../e zu
verschachteln.
Wie kann man denn dieses Problem geschickt umgehen ohne [...]
Da bleibt natürlich noch die Frage, was es dir bringt "[B][B]Text[/B][/B]"
ersetzen zu lassen. Letztlich ist das eine ungültige Eingabe, und in dem
Fall macht es sicher Sinn, wenn der User das auch merkt - auf alle Fälle
besser, als wenn du auf Biegen und Brechen versuchst, daraus etwas
Sinnvolles zu machen. Filter doch an der Stelle einfach die überflüssigen
Auszeichnungen raus - <b><b>text</b></b> bringt wenig Freude, wenn du im
Stylesheet nix dafür vorbereitet hast (abgesehen davon, daß ältere Browser
bei zu vielen Auszeichnungen wieder auf normale Anzeige zurückfallen).
MsF,
milky
Okay, dass es in dem Fall wenig Sinn hat sehe ich ein. Doch wie stehts mit mehreren Zitaten ineinander? Da fällt mir zb. keine Lösung ein.