[REGEX] Rekursion

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [REGEX] Rekursion

    Hallo,
    um Zitate im Newsletterstyle (">" am Anfang jeder Zeile) grafisch aufuzwerten benutze ich folgendes RegEx:

    Code:
    $string= preg_replace("/^>.*$(?!\n>)/Umse", "parse_newletterquotes('\\0')", $string);
    es ruft eine rekursive Funktion parse_newletterquotes auf um verschachtelte Newsletterzitate zu ermöglichen:

    Code:
    function parse_newletterquotes($string)
    {
        $string = preg_replace("/^>/m", "", $string);
        $string = preg_replace("/^>.*$(?!\n>)/Umse", "parse_newletterquotes('\\0')", $string);
        return "<blockquote>".$string."</blockquote>";
    }
    Das ganze möchte ich aber nun verbessern und eine rekursive Behauptung verwenden. Mein Versuch:

    Code:
    $string= preg_replace("/^&gt;(((?!&gt;).*)|(?R))$(?!\n&gt;)/Ums", "<blockquote>\\2</blockquote>", $string);
    klappt nicht. Jetzt die Frage: Hat einer ne Idee das hinzubekommen, und, ist das überhaupt möglich?

    MfG

    Luke

  • #2
    Re: [REGEX] Rekursion

    Wenn ich Dich richtig verstanden habe, hast Du ?R falsch verstanden. Eine rekursive Funktion zum Ersetzen brauchst Du weiterhin. Lediglich eine eventuell vorhandene, rekursive Struktur in Deinem Ausgangstext wird durch ?R gefunden werden.

    Außerdem verstehe ich nicht, warum Du hinter dem $ noch eine Assertion anbringst, da Du ja gleichzeitig schon Modifier m verwendest. Hat sich das jemals als notwendig erwiesen? Betrifft nicht Dein Problem direkt, würde mich nur mal interessieren - eventuell übersehe ich etwas.

    Wieso rufst Du die Funktion nicht direkt mit Deinem Text auf - wenn nötig etwas abgewandelt - sondern erneut per preg_replace? Ist doch irgendwie doppelt gemoppelt?
    Die Zeit hat ihre Kinder längst gefressen

    Kommentar


    • #3
      > Lediglich eine eventuell vorhandene, rekursive Struktur in Deinem
      > Ausgangstext wird durch ?R gefunden werden.

      Das war noch meine letzte Frage 'geht das überhaupt'. Hatte gehofft der würde evtl. pro Rekursion \\2 ersetzen.


      > Außerdem verstehe ich nicht, warum Du hinter dem $ noch eine
      > Assertion anbringst, da Du ja gleichzeitig schon Modifier m
      > verwendest.

      Das ganze soll Blöcke von dem ersten "\n>" bis zum ersten darauffolgendem "\n(!>)" finden, also jeweils ein Quoteblock.

      > Wieso rufst Du die Funktion nicht direkt mit Deinem Text auf - wenn
      > nötig etwas abgewandelt - sondern erneut per preg_replace? Ist
      > doch irgendwie doppelt gemoppelt?

      Hab das ganze in einem ziemlich großen Array von zu parsenden patterns (http://svn.sourceforge.net/viewcvs.c...w=markup&rev=3), deswegen der Aufruf über das RegEx

      Kommentar

      Lädt...
      X