Wer kann mir bei diesem regulären ausdruck helfen?

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

  • Wer kann mir bei diesem regulären ausdruck helfen?

    Ich bastle gerade an einem Regulären Ausdruck rum und komme nicht weiter. Ich möchte erkennen, wie oft in einem Text eine Tabelle vor kommt, mit dem Layout wie im Kommentar. Dazu will ich abfragen, wie oft <TABLE (irgendwas außer </TABLE>)</TABLE> vorkommt, weil mit <TABLE.*</TABLE> kommt immer nur 1 als Ergebnis zurück.
    Kann mir jemand helfen?
    PHP-Code:
    /*<TABLE style=\"WIDTH: 335px; HEIGHT: 96px\" cellSpacing=2 cellPadding=2 border=1><TBODY>
    <TR>
    <TD><BR></TD>
    <TD><BR></TD>
    </TR><TR>
    <TD><BR></TD>
    <TD><BR></TD>
    </TR>
    </TBODY></TABLE>*/
    preg_match_all("/<TABLE[^(<\/TABLE>)]*<\/TABLE>/"$text$tabellen);
    $anz1 count ($tabellen[0]);
    echo 
    $anz1

  • #2
    das liegt daran, dass dein regexp ( um genau zu sein, das * ) greedy ( gefräßig) ist. es matcht so viel es kann - vom ersten <table> bis zum _letzten_ </table>!
    ein fragezeichen sagt dem sternchen das es non-greedy arbeiten soll, also nur so viel matcht, wie es unbedingt muss um das regexp zu erfüllen.

    /<TABLE(.*?)</TABLE>/

    Kommentar


    • #3
      Naja, das macht nicht das ? sondern der Modifier "U"

      PHP-Code:
      "/<table[^(</table> )]*</table>/Ui" 
      U = Ungreedy
      i = case insensitive

      Kommentar


      • #4
        Ihr seit spitze! Danke!

        Kommentar


        • #5
          Original geschrieben von prego
          Naja, das macht nicht das ? sondern der Modifier "U"

          PHP-Code:
          "/<table[^(</table> )]*</table>/Ui" 
          U = Ungreedy
          i = case insensitive
          Beides hat den selben effekt. Siehe auch manpages zu pcre.
          Von daher hat phoboslab also ebenso recht.


          greets

          //EDIT hier der entsprechende auszug aus der manpage
          However, if a quantifier is followed by a question mark, it ceases to
          be greedy, and instead matches the minimum number of times possible, so
          the pattern ...
          Zuletzt geändert von closure; 28.03.2006, 12:08.
          (((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")

          Kommentar


          • #6
            Oh, das war mit neu...

            Danke

            Kommentar


            • #7
              > [^(</table> )]*

              geht das wirklich? IMHO nicht, kriegs aber irgendwie auch nicht getestet

              Kommentar


              • #8
                Original geschrieben von Luke
                > [^(</table> )]*

                geht das wirklich? IMHO nicht, kriegs aber irgendwie auch nicht getestet
                Ne, das geht nicht, aber mit "/<TABLE.*<\/TABLE>/Ui" gehts.

                Kommentar


                • #9
                  Hi,

                  phoboslab hat doch schon eine gute lösung gezeigt.
                  Zu beachten ist, dass hier nested tables nicht so erkannt werden
                  wie man es vll möchte. Ausserdem sind die modifier s und m notwendig. Optional kann man noch i angeben.

                  Code:
                  /<table>(.*?)<\/table>/ims
                  greets
                  (((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")

                  Kommentar


                  • #10
                    m? Brauchste doch nicht


                    Schade dass das mit dem [^(text)] nicht geht, das wär ja die Entdeckung des jahrhunderts

                    Kommentar


                    • #11
                      Original geschrieben von closure
                      Hi,

                      phoboslab hat doch schon eine gute lösung gezeigt.
                      Zu beachten ist, dass hier nested tables nicht so erkannt werden
                      wie man es vll möchte. Ausserdem sind die modifier s und m notwendig. Optional kann man noch i angeben.

                      Code:
                      /<table>(.*?)<\/table>/ims
                      greets
                      nested Tables wird es nicht geben, verwende bereits die Lösung von oben, trotzdem lief die Diskussion weiter, ist ja auch interessant, noch mehr über das Thema zu wissen, aber was Du über die modifier m und s schreibst verstehe ich nicht, ich habe dazu folgendes auf http://www.php-resource.de/tutorials/read/10/1/ gefunden:

                      s
                      Der s-Modifier veranlasst den Parser dazu, die Zeichenkette, auf die der reguläre Ausdruck angewendet wird, in einzelne Zeilen zu unterteilen - das Pattern wird hierbei also nicht auf die ganze Zeichenkette bezogen, sondern jede Zeile einzeln behandelt

                      m
                      Der m-Modifier ist das Komplement zum s-Modifier: Die Zeichenkette wird nicht in Zeilen aufgetrennt, sondern im Ganzen behandelt.

                      Die Modifier können beliebig kombiniert werden, s und m zusammen machen allerdings wenig Sinn.

                      Kommentar


                      • #12
                        Das Tutorial ist voll der Dreck, ließ hier mal:

                        http://www.php.net/manual/de/referen....modifiers.php

                        Kommentar


                        • #13
                          s
                          Der s-Modifier veranlasst den Parser dazu, die Zeichenkette, auf die der reguläre Ausdruck angewendet wird, in einzelne Zeilen zu unterteilen - das Pattern wird hierbei also nicht auf die ganze Zeichenkette bezogen, sondern jede Zeile einzeln behandelt

                          m
                          Der m-Modifier ist das Komplement zum s-Modifier: Die Zeichenkette wird nicht in Zeilen aufgetrennt, sondern im Ganzen behandelt.

                          Die Modifier können beliebig kombiniert werden, s und m zusammen machen allerdings wenig Sinn.
                          Hmm das ist mir neu. m sucht über mehre zeilen und s bewirkt dass der punkt-operator auch newlines matched. Wieso schliessen sich
                          beide aus ? Ich bekomme jedenfalls bei suchen über mehrere zeilen
                          nur ergebnisse wenn ich beide modifier verwende.


                          //EDIT nachtrag:
                          ich will ja nichts sagen, aber das pcre tutorial ist nicht so gut.
                          hier wieder der auszug aus der manpage
                          modifier description Perl corresponding

                          PCRE_CASELESS case insensitive match /i
                          PCRE_MULTILINE multiple lines match /m
                          PCRE_DOTALL dot matches newlines /s
                          greets
                          Zuletzt geändert von closure; 28.03.2006, 16:10.
                          (((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")

                          Kommentar


                          • #14
                            Der s-Modifier veranlasst den Parser dazu, die Zeichenkette, auf die der reguläre Ausdruck angewendet wird, in einzelne Zeilen zu unterteilen
                            Das ist m.E. schlichtweg Quark.

                            Wie du schon sagtest, sorgt der Modifier s dafür, dass der Punkt auch Newlines matcht. Deshalb ja auch der Name PCRE_DOTALL.
                            Der m-Modifier ist das Komplement zum s-Modifier: Die Zeichenkette wird nicht in Zeilen aufgetrennt, sondern im Ganzen behandelt.
                            Auch diese Beschreibung taugt wenig bis gar nichts.

                            Das PHP-Manual beschreibt es m.E. besser und genauer:
                            Standardmäßig behandelt PCRE eine zu durchsuchende Zeichenkette wie eine einzige Zeile von Zeichen (auch wenn sie tatsächlich mehrere Zeilenumbrüche enthält). Das Metazeichen für einen Zeilenanfang (^) passt nur auf den Anfang der Zeichenkette, das Metazeichen für ein Zeilenende ($) nur auf das Ende der Zeichenkette (falls der Modifikator D nicht gesetzt ist). [...] Wenn dieser Modifikator gesetzt ist, passen die Zeilenanfang- und Zeilenende-Konstrukte in der Zeichenkette sowohl direkt nach, bzw. vor einem Zeilenumbruch als auch auf deren Anfang und Ende.
                            Original geschrieben von closure
                            Wieso schliessen sich beide aus ?
                            Tun sie nicht.

                            Sie bewirken beide etwas (größtenteils) unabhängiges.

                            Auch m als "Komplement" zu s zu bezeichnen, halte ich für Unfug.
                            I don't believe in rebirth. Actually, I never did in my whole lives.

                            Kommentar


                            • #15
                              Original geschrieben von wahsaga
                              Tun sie nicht.

                              Sie bewirken beide etwas (größtenteils) unabhängiges.

                              Auch m als "Komplement" zu s zu bezeichnen, halte ich für Unfug.
                              Ich hab schon an mir gezweifelt.

                              greets
                              (((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")

                              Kommentar

                              Lädt...
                              X