[REGEX] doppelte umbrüche nicht erwünscht ....

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

  • [REGEX] doppelte umbrüche nicht erwünscht ....

    nun habe ich mal wieder was zum kopfzerbrechen für euch.

    gegeben ist bb-code. der einfachheit halber beschränken wir uns mal auf [B ].

    das ist ja der allgemeine standard dafür
    Code:
    '!\[b\](.+)\[\/b\]!siU'
    nun ist es aber so, wenn der user folgendes eingibt ....
    Code:
    [b ]blah
    
    blub[/ b ]
    wird der html-code invalide ....
    Code:
    <p><strong>blah</p><p>blub</strong></p>
    *zum hintergrund: ein doppelter break (also 2x enter für einen absatz) erzeugt auch einen korrekten absatz im template. 1x enter erzeugt entsprechend auch nur ein '<br />\n'.

    wie kann ist es nun machen, dass bb-code-tags, in denen sich ein doppelter umbruch befindet, nicht mehr gefunden werden.

    das sind meine bisherigen versuche. aber so optimal ist das auch nicht wirklich.
    Code:
    '!\[b\]([^(\n\n|\r\r|\r\n\r\n)]+)\[\/b\]!siU'
    
    '!\[b\]([^(\\n\\n|\\r\\r|\\r\\n\\r\\n)]+)\[\/b\]!siU'
    
    '!\[b\]([^(\\\n\\\n|\\\r\\\r|\\\r\\\n\\\r\\\n)]+)\[\/b\]!siU'
    mal sehen, wer sich ein glas bier verdienen kann... abzuholen in neuss...
    INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |



  • #2
    hm ... versteh' ich deine Ersetzung nicht ganz ...

    z.B. für den o.a. einfachen Fall hast du den Text in $1 stehen wie kommt's, dass es so raus kommt:

    <p><strong>blah</p><p>blub</strong></p>

    und nicht

    <p class="clsstrong">blah</p><p class="clsstrong">blub</p>

    Kommentar


    • #3
      bei der ausgabe des textes im template wird \n\n durch </p><p> ersetzt.

      das template weiss von [b ] usw nichts. das muss es auch nicht wissen.

      nur der validator von w3c meckert halt zurecht. und ich will ihm alles recht machen. weiss aber noch nicht genau wie. :-P
      INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


      Kommentar


      • #4
        darf man davon ausgehen, dass nur folgender fall auftreten kann, bei dem KEIN <b> </b> gesetzt werden soll:

        TextText\n\nTextText

        d.h. es taucht niemals
        TextText\n\n\nTextText
        oder
        \n\nTextText
        oder
        TextText\n\n

        auf?

        alternativ könntest du erst \n\n durch <p> ersetzen und dann im RegEx leichter <p> ausschließen.
        Sunshine CMS
        BannerAdManagement
        Borlabs - because we make IT easier
        Formulargenerator [color=red]Neu![/color]
        Herkunftsstatistik [color=red]Neu![/color]

        Kommentar


        • #5
          doch. ich weiss nicht, wie oft der user enter drückt. daher kann ich nichts ausschliessen, ausser am anfang und am ende des strings. das wird eh abgeschnitten. ;-)

          ich habe jetzt noch folgendes ausprobiert ....
          Code:
          "!\[b\]([^\n]+)\[\/b\]!siU"
          ... das klappt auch. aber es sollen halt keine einfachen \n ausgeklammert werden, sondern nur doppelte \n\n.

          das beste, was ich mir noch überlegt habe, ist, wenn man
          Code:
          [b ]blah\n\nblub[/b ]
          durch
          Code:
          [b ]blah[/b ]\n\n[b ]blub[/b ]
          ersetzen könnte. dann ist der user auch nicht verwirrt, was da passiert ist und der html-code ist immer noch valide.
          INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


          Kommentar


          • #6
            Code:
            "!\[b\]([^\n]{2,})\[\/b\]!siU"
            *ganz dumm das + nach {2,} geändert hat*

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

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

            Kommentar


            • #7
              leider klappt das auch nicht so ganz, wie ich es erhofft habe. aus ...

              Code:
              [b ]das ist der erste teil in bold
              
              und hier der zweite teil[/b ]
              
              [b ]sadsdk[/b ]ljsakldjsakldj jlsj lkjd kjsf [i ]kldsf
              dlfjdsölfjdsljflkdsjfkdsjflkjdsfds
              fdsfjdskljflksdjflksjfdslf
              sads[/i ]adsadasdsadsa
              ... wird nur ....

              Code:
              [b ]das ist der erste teil in bold
              
              und hier der zweite teil[/b ]
              
              <strong>sadsdk</strong>ljsakldjsakldj jlsj lkjd kjsf [i ]kldsf
              dlfjdsölfjdsljflkdsjfkdsjflkjdsfds
              fdsfjdskljflksdjflksjfdslf
              sads[/i ]adsadasdsadsa
              d.h. er hat zwar das bold nicht genommen, wo \n\n enthalten war, jedoch auch gleich das das italic ignoriert, wo nur 1x \n pro zeile enthalten war. das italic muss natürlich geparst werden können.

              weitere ideen? wo ist eigentlich REX ?

              * RegEx -> wau wau -> derHund *
              INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


              Kommentar


              • #8
                du hast dir aber auch echt ein Problem rausgepickt
                *locker 25 Minuten jetzt an der Lösung gesessen hat*

                aber es funktioniert

                *auf Anhang deutet*
                Angehängte Dateien

                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
                  hey danke dir. aber es ist nicht korrekt ...

                  Code:
                  <strong>das ist der erste teil in bold
                  und hier der zweite teil</strong>
                  [color=red]<strong>das ist der erste teil in bold
                  
                  und hier der zweite teil</strong>
                  <strong>das ist der erste teil in bold
                  
                  
                  und hier der zweite teil</strong>[/color]
                  
                  <strong>sadsdk</strong>ljsakldjsakldj jlsj lkjd kjsf <italic>kldsf
                  dlfjdsölfjdsljflkdsjfkdsjflkjdsfds
                  fdsfjdskljflksdjflksjfdslf
                  sads</italic>adsadasdsadsa
                  das rote zeug hätte nicht auftauchen dürfen. denn hier sind ja definitiv 2x \n dazwischen.

                  sobald \n\n zwischen den tags ist, darf es nicht geparst werden. wird es aber bei deinen code. oder ist bei dir die ausgabe anders als bei mir?

                  \n\n\n würde in meinem fall zu </p><p><br /> oder <br /></p><p> (weiss grad nicht wie rum, ist aber egal)

                  \n wird zu <br />

                  \n\n zu </p><p>

                  wenn ich den block ans template gebe, wird dort entsprechend der rest (also die n-mal \n ) ersetzt. da habe ich im code keinen einfluss. und das template weiss vom bb code nichts. ,-)


                  EDIT:
                  wo ist rex, wenn man ihn braucht ....
                  Zuletzt geändert von Abraxax; 04.12.2005, 22:38.
                  INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                  Kommentar


                  • #10
                    ehm...also bei mir ist die Ausgabe korrekt?

                    http://83.135.99.185/test2.php

                    (und ich hab nix mehr dran gemacht ... ist allerdings auch brandneu-php 5.1.1 und demnach eventuell auch ne neue pcre-lib :\ )
                    Zuletzt geändert von ghostgambler; 04.12.2005, 22:42.

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

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

                    Kommentar


                    • #11
                      mhm. ich habe kein php 5 auf der maschine. dann mag es daran liegen.
                      mal sehen wann der wauwau kommt...
                      INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                      Kommentar


                      • #12
                        fein. icq sei dank. ;-)

                        @all
                        mit
                        Code:
                        "#\[b\](([^\n]|\n(?!(\r\n|\n)))*)\[\/b\]#siU"
                        klappt es nun.


                        EDIT:
                        w3c freut sich nun auch wieder. ;-)

                        This Page Is Valid XHTML 1.1!

                        falls noch jemand eine idee oder lust hat ... wenn man, bevor alles als bb-code geparst wird, noch prüfen und ersetzen kann, dass die tags vor \n\n|\r\n\r\n entsprechend geschlossen und danach wieder öffnen, wäre ich auch nicht abgeneigt.

                        Zuletzt geändert von Abraxax; 04.12.2005, 23:02.
                        INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                        Kommentar


                        • #13
                          Original geschrieben von Abraxax
                          EDIT:
                          falls noch jemand eine idee oder lust hat ... wenn man, bevor alles als bb-code geparst wird, noch prüfen und ersetzen kann, dass die tags vor \n\n|\r\n\r\n entsprechend geschlossen und danach wieder öffnen, wäre ich auch nicht abgeneigt.

                          preg_replace_callback?
                          wenn richtig angegangen, ist das sogar nichtmal DER overkill für deine Seite
                          (ein preg_replace_callback auf alle Tags gleichzeitig, und die Funktion erkennt Tag und macht das mit dem close/open)

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

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

                          Kommentar


                          • #14
                            das muss ich mir mal in ruhe zu gemüte führen. ;-)
                            INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                            Kommentar


                            • #15
                              Original geschrieben von Abraxax
                              fein. icq sei dank. ;-)

                              @all
                              mit
                              Code:
                              "#\[b\](([^\n]|\n(?!(\r\n|\n)))*)\[\/b\]#siU"
                              klappt es nun.
                              und noch eine Erleuchtung (ich WAR schon im Bett )

                              Code:
                              "#\[i\](([^\n]|(\n\r|\n)(?!(\r\n|\n)))*)\[\/i\]#siU"
                              sollte gehen und packt das richtige \r
                              *nicht mehr getestet hat, weil apache schon aus ist*

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

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

                              Kommentar

                              Lädt...
                              X