Komisches Verhalten von RegEx

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

  • Komisches Verhalten von RegEx

    Ich stelle ein komisches Verhalten meines RegEx fest:

    PHP-Code:
    $content preg_replace("#<([^(a|b|i|br|img|ul|li)]) .+>(.*)</\\1>#isUS""\\2"$content); 
    Soll mir alle Tags außer die in der Zeichenklasse entfernen.
    Macht er auch, aber nicht alle auf einmal. Wenn ich die dorch den Content rattern lasse, sind die Hälfte der Tags weg. Beim zweiten Durchlauf dann noch mal ein Teil weniger, erst beim dritten mal sind dann endgültig alle Tags draußen.

    Warum macht er das nicht alles gleich beim ersten mal?


    Grüße, Andi

  • #2
    kann es sein, dass die tags verschachtelt sind? dann werden afaik die inneren übersprungen.
    Kissolino.com

    Kommentar


    • #3
      Das mit der Verschachtelung kommt hin, aber ich dachte, dass das die RegEx berücksichtigt?
      Ich habe es jetzt in eine Schleife gesetzt, da sieht es schon mal besser aus. Allerdings kann man nie vorher sagen wie stark die Verschachtelung ist.

      Gibts da einen Trick? Vielleicht ein anderer Weg mit der RegEx zu filtern?

      Grüße, Andi

      Kommentar


      • #4
        such mal hier im forum, war glaub ich letzte woche nochmal das thema ... happy hatte einen "tag" gepostet ich glaube (?R) für rekursiv ... ich krieg damit allerdings keine ausgabe ...

        alternative: machs in einer rekursiven funktion ... solange preg_match => preg_replace ... kann aber unperformat sein

        allerdings kannst du mit str_replace(array(),'',$x) auf alle "einfachen" tags b, i, br die sache beschleunigen
        Kissolino.com

        Kommentar


        • #5
          Ah, OK, also ich habe das jetzt mit while(preg_match()) gamcht, läuft eigentlich superschnell. Ich hatte es mal in einer for()-Schleife mit 50 Durchläufen - das ging auch ratzfatz.

          Ich habe aber was komisches bemerkt:
          Laut meiem RegEx lasse ich ja alles in Tags (außer a,b,i,br ertc.) löschen.
          Jedoch gibt es einen Tag <o></o> der nicht erkannt wird. Das kann doch eigentlich nicht sein. Oder übersehe ich das was.
          Ich habe einen weiteren RegEx der auf <(o.*)>(.*)</\\1> sucht und der findet den dann.
          Aber eigentlich sollte der doch auch von dem ersten mit erkannt werden

          Verstehe ich nicht.

          Kommentar


          • #6
            Hi,

            teste das bitte mal:
            PHP-Code:
            $content preg_replace("#<([^(a|b|i|br|img|ul|li)]+).*>(.*)</\\1>#isUS""\\2"$content); 
            <- ohne while Schleife
            Grüsse,
            Sebastian


            Profil Flex Freelancer
            Twitter twitter.com/flashhilfe
            Web Flash und Flex Community

            Kommentar


            • #7
              1.wo ist der unterschied zwischen /s und /S!?!?

              2.das (?R) geht nicht bei PCRE!!!

              3.du mußt die for schleife ja keine 50 mal machen lassen, sondern nur sooft wie du verscheidene tags hast, weil eine tag zweimalverschlüseln: <i><i>bla</i></i> ist ja eh sinnlos!
              Die Musikreview Seite

              hi, i'm a signature virus. copy me into your signature to help me spread.

              Kommentar


              • #8
                Das sollte auch ohne Schleife funktionieren.

                So gehts:
                PHP-Code:
                $content '<font color="red">sdfs33dfsdf</font>sdf sdf sf<b><i>adadad ad ada </i></b> 
                <font color="#000000"><b>sssdfsdf</b>
                </font><br><br>bla bla<o:>sfd</o><font color="#000000">sdfs33dfsdf</font>'
                ;

                $content preg_replace("#<([^(a|b|i|br|img|ul|li)]+).*>(.*)</\\1>#isUS""\\2"$content);

                echo 
                $content
                Ausgabe:
                sdfs33dfsdfsdf sdf sf<b><i>adadad ad ada </i></b>
                <b>sssdfsdf</b>
                <br><br>bla blasfdsdfs33dfsdf


                http://www.regenechsen.de/regex_de/regex_liste_de.html ->

                s betrachtet den String als einzeilig, der Punkt erkennt auch im String befindliche Newline-Zeichen

                S zusätzliche Analyse des Suchpatterns zur Beschleunigung bei häufiger Verwendung des Regex
                Grüsse,
                Sebastian


                Profil Flex Freelancer
                Twitter twitter.com/flashhilfe
                Web Flash und Flex Community

                Kommentar


                • #9
                  ja aber bei denem $contet hattest du jetzt ja auch keine font-tags verschachtelt wenn ich das richtig sehe!
                  Die Musikreview Seite

                  hi, i'm a signature virus. copy me into your signature to help me spread.

                  Kommentar


                  • #10
                    @Sebastian: Das geht bei mir auch nicht :-( Da sind schon ziemliche Verschachtelungen drin. Also in der Schleife gehts jetzt prima und auch echt schnell. Da habe ich kein Problem mit.

                    @Tartax: Zu deiner Frage: Klein "s" = der . (Punkt) gilt für alle Zeichen, auch \n. Groß "S" Chached das übersetzte Muster des RegEx, diese wird so bei vielen Treffen schneller.
                    Siehe dazu auch PCRE-Optionen bei RegEx.


                    Dank & Grüße,
                    Andi

                    Kommentar


                    • #11
                      @ tartax
                      Jup stimmt. Hatte ich übersehen.

                      @andik
                      Ok. Hatte noch was versucht:
                      $content = preg_replace("#<(/?[^(a|b|i|br|img|ul|li)].*)>#isUS", "", $content);

                      Allerdings klappt das auch nicht wie gewünscht... ist das eigentlich nen Bug? So wie es jetzt ist werden nur <b> <i> etc stehen gelassen. Alle anderen, auch </b> werden gelöscht.

                      Nimmt man das ^ raus. So werden alle <b> und </b> entfernt... komisch komisch.
                      Grüsse,
                      Sebastian


                      Profil Flex Freelancer
                      Twitter twitter.com/flashhilfe
                      Web Flash und Flex Community

                      Kommentar

                      Lädt...
                      X