muenzchen: Problem mit preg_replace und Verschachtelung

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

  1. 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

    1. 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.

      1. 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

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
  2. 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

    1. 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.