Newletterstyle-quotes grafisch aufwerten

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

  • Newletterstyle-quotes grafisch aufwerten

    Hi

    Für ein Wiki möchte ich dass Newsletterstyle-Zitate (Bsp:

    >Mehrzeiliges
    >Zitat
    Antwort

    so umgewandelt werde dass sie Nachher so aussehen.

    Mein Bisheriger Ansatz funktioniert so dass er per RegEx das erste vorkommen von "\n>" bis zum ersten "\n[^>]" danach sucht, es an eine funktion weitergibt die dann den ganzen Block zu einem DIV umwandelt welches entsprechend (Newsletterstyle) formatiert ist. Das genze funktioniert rekursiv, damit man auch verschachtete Quotes machen kann. Der Code
    Code:
    $string = preg_replace("/(\n|^)(>.*)(\n([^>])|$)/Use",
              "parse_newsletterquote('\\1', '\\2', '\\4')", $string);
    
    function parse_newsletterquote($before, $string, $after)
    {
        $string = stripslashes($string);
    
        $string = preg_replace("/(\n|^)>/", "\\1", $string);
        $string = preg_replace("/(\n|^)(>.*)(\n([^>])|$)/Use",
                  "parse_newsletterquote('\\1', '\\2', '\\4')", $string);
    
        return "<div style=\"padding-left:25px;
                background-image:url('images/newsletter_quote.gif');
                background-repeat:repeat-y;\">".$string."</div>".$after;
    }
    funktioniert gut, hat aber Bugs. Zum Beispiel funktionieren 2 Newsletterquote hintereinander nicht (k.a. wieso). Deshalb meine Frage: Wie würdet ihr das Problem lösen (anderen Ansatz), oder habt ihr verbesserungen zu meiner Lösung?

    MfG Luke
    Zuletzt geändert von Luke; 23.05.2006, 13:15.

  • #2
    Re: Newletterstyle-quotes grafisch aufwerten

    ich benutze dies
    Code:
    $pattern[] = "#^> .*$(?!\n> |\r\n> )#Uums";
    $replace[] = '<blockquote><p>\\0</p></blockquote>';
    und fahre damit wunderbar ... allerdings matcht das nur, wenn
    > hier text ist
    >würde nicht gemacht werden

    Das hatte ich damals in Kauf genommen, damit man Smileys
    >.< am Anfang machen kann ... ansonsten wäre der Regex geringfügig komplizierter ausgefallen, darauf hatte ich aber damals keine Lust (und habe sie immernoch nicht ^^,)



    PHP-Code:
    <?php

    $text 
    "bla bla
    > bla
    >bla
     bla bla

    > > bla"
    ;
    $pattern "#^> .*$(?!\n> |\r\n> )#Uums";
    $replace '<blockquote><p>\\\\0</p></blockquote>';

    preg_match_all($pattern$text$match);
    echo 
    '<pre>' print_r($match1) . '</pre>';
    Code:
    Array
    (
        [0] => Array
            (
                [0] => > bla
                [1] => > > bla
            )
    
    )

    Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

    bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
    Wie man Fragen richtig stellt

    Kommentar


    • #3
      Hm, dein Pattern findet aber nicht Sequenzen wie

      >dies ist
      >durchgehender text

      als einen Block; Aber du hast mich auf ne idee gebrach, erst mal zu durchsuchen, dann zu ersetzen, bei der Suche tritt nämlich nicht der Oben erwähnte Bug auf... .

      Kommentar


      • #4
        Original geschrieben von Luke
        Hm, dein Pattern findet aber nicht Sequenzen wie

        >dies ist
        >durchgehender text

        als einen Block;


        1. Ohne Leerzeichen, findet mein Regex gar nix
        2. Mit Leerzeichen findet er Blöcke wunderbar:

        PHP-Code:
        <?php

        $text 
        "bla bla
        > bla
        > bla
        >bla
         bla bla

        > > bla"
        ;
        $pattern "#^> .*$(?!\n> |\r\n> )#Uums";
        $replace '<blockquote><p>\\\\0</p></blockquote>';

        preg_match_all($pattern$text$match);
        echo 
        '<pre>' print_r($match1) . '</pre>';
        Code:
        Array
        (
            [0] => Array
                (
                    [0] => > bla
        > bla
                    [1] => > > bla
                )
        
        )
        Man sieht unter [0]
        > bla
        > bla

        und unter [i]
        > > bla

        ... für mich sind das Blöcke ~_~

        Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

        bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
        Wie man Fragen richtig stellt

        Kommentar


        • #5
          Irgendwie muss die Weedwolke zwischen mir und meinem Monitor mir die Sicht versperrt haben XD sorry

          Kommentar


          • #6
            Um ehrlich zu sein versteh' ich das Pattern nicht (und das obwohl ich Fanatiker bin). Was genau macht diese Stelle: (?!\n> , also das "?!" ? Und wie kommt es dass er auch ganze Blöcke einfängt, nach meinem Verständnis müsste er von vom ersten \n>text bis inklusive zum darauffolgendem \> gehen und nicht weiter (also "\n>text\n>").

            Vielen Dank (und danke auch auf jeden Fall für dieses geniale, da offensichtlich funktionierendes RegEx),
            Luke

            Kommentar


            • #7
              Original geschrieben von Luke
              Irgendwie muss die Weedwolke zwischen mir und meinem Monitor mir die Sicht versperrt haben XD sorry
              mfg

              Kommentar


              • #8
                Original geschrieben von Luke
                Um ehrlich zu sein versteh' ich das Pattern nicht (und das obwohl ich Fanatiker bin). Was genau macht diese Stelle: (?!\n> , also das "?!" ? Und wie kommt es dass er auch ganze Blöcke einfängt, nach meinem Verständnis müsste er von vom ersten \n>text bis inklusive zum darauffolgendem \> gehen und nicht weiter (also "\n>text\n>").

                Vielen Dank (und danke auch auf jeden Fall für dieses geniale, da offensichtlich funktionierendes RegEx),
                Luke
                also ehrlich gesagt ... weiß ich das nicht mehr


                #^> .*$(?!\n> |\r\n> )#Uums

                das in der Klammer ist eine negative Assertion.
                $ indiziert somit ein Zeilenende und das Zeilenende darf, durch die negative Assertion, nicht von einem Zeilenumbruch+"> " gefolgt sein. Damit matcht es alles, bis zum Ende des Zitates ... ist etwas kompliziert, hat mich auch nen halben Tag gekostet, aber es funktioniert ^^
                Und so kompliziert ist es eigentlich gar nicht ... jetzt wo ich so drauf gucke ^^

                Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                Wie man Fragen richtig stellt

                Kommentar


                • #9
                  Dann ist es also vom Prinzip her wohl so wie meins.. aber: Was ich noch nicht kannte waren die Assertions, insbesondere dachte ich es gäbe keine Möglichkeit der negativen Assertation. Das geile an denen (abgesehen von der Funktionalität) ist dass die Assertion selbst nicht zum Match gezählt wird, also das letzte \n> anders als bei meinem pattern nicht mit replaced wird, so dass auch 2 aufeinanderfolgende quotes funktionieren (ansonsten würde ein nötiges \n durch den replace übergangen)

                  Kommentar


                  • #10
                    PS: DANKE !

                    Kommentar

                    Lädt...
                    X