Nullpeiler: preg_match_all Frage - wer kennt sich aus ? Danke.

Hallo,

ich habe in die Variable $html eine Seite geladen, nun möchte ich
den Text zwischen

rbb2cu"><div class="reader">

und

</div>

in die Variable $treffer laden

mein Versuch :

preg_match_all('@(?<=rbb2cu"><div class="reader">)(.*?)</div@',$html, $treffer);

schlägt fehl,

ich vermute mal wegen den ganzen < > Zeichen

die Lösung ist bestimmt ganz einfach, nur ich peile das jetzt
nicht.

Danke für Hilfe.

  1. Lieber Nullpeiler,

    wozu die Backslashes? Dein Muster steht doch in einfachen Quotes, da solltest Du die Doublequotes nicht "escapen"! Außerdem verstehe ich nicht, warum Du Lookbehind (?<=)benutzt... lass es doch weg!

    preg_match_all('@(?<=rbb2cu"><div class="reader">)(.*?)</div@',$html, $treffer);

    Und den Rückgabewert der Funktion solltest Du auch nicht "wegwerfen", sondern mindestens in einem if-Statement, oder gar einer Variablen abfragen.

    if (preg_match_all('@rbb2cu"><div class="reader">(.*?)</div@',$html, $treffer)) {  
        print_r($treffer);  
    }  
      
    $gefunden = preg_match_all('@rbb2cu"><div class="reader">(.*?)</div@',$html, $treffer);  
    if ($gefunden) {  
        print_r($treffer);  
    }
    

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. Hi Felix!

      Wichtig sind auch die Modifier U und m.
      "U" für ein nicht gieriges Verhalten und "m", damit "." auch Zeilenumbrüche matcht.

      MfG H☼psel

      --
      "It's amazing I won. I was running against peace, prosperity, and incumbency."
      George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
      Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
      1. Liebe Hopsel,

        "U" für ein nicht gieriges Verhalten

        dafür steht das Fragezeichen nach dem ".*", um eben hier nicht gierig zu sein. Mir ist es auch lieber, von einem standardmäßig gierigen Verhalten auszugehen, in einzelfällen mit dem Fragezeichen auf "hier nicht gierig" zu schalten, als dieses generell abzustellen.

        und "m", damit "." auch Zeilenumbrüche matcht.

        Da bevorzuge ich "s" - keine Ahnung warum, aber das verwende ich jetzt schon Jahrelang erfolgreich...

        Liebe Grüße,

        Felix Riesterer.

        --
        ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
        1. Hi Felix!

          Liebe Hopsel,

          Ich bin eine Er. =)

          Ich gebe dir in all deinen Punkten recht und hoffe du hast nichts dagegen, wenn ich sie gleich verinnerliche. ;-)

          MfG H☼psel

          --
          "It's amazing I won. I was running against peace, prosperity, and incumbency."
          George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
          Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
          1. Ich gebe dir in all deinen Punkten recht und hoffe du hast nichts dagegen, wenn ich sie gleich verinnerliche. ;-)

            BOAH seit Ihr schlau ... m U s gierig oder nicht ... da kommt bei mir nur Bahnhof an ... und es klappt immer noch nicht ... f***

            1. Lieber Nullpeiler,

              BOAH seit Ihr schlau ... m U s gierig oder nicht ... da kommt bei mir nur Bahnhof an ...

              dann solltest Du Dich eingehender mit den "regulären Ausdrücken" beschäftigen. Denn um diese Teile geht es bei den preg_xyz-Funktion in PHP. Wer diese regulären Ausdrücke anwenden kann (und auch mit den Modifikatoren, die solche Ausdrücke haben können!), der kann die besagten Funktionen gewinnbringend einsetzen. Lerne!

              und es klappt immer noch nicht ... f***

              Soso, und warum hast Du auf meine Korrekturen noch nicht reagiert? Hast Du sie etwa übersehen? Oder "klappt" es auch mit diesen noch immer nicht?

              Liebe Grüße,

              Felix Riesterer.

              --
              ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
              1. Soso, und warum hast Du auf meine Korrekturen noch nicht reagiert? Hast Du sie etwa übersehen? Oder "klappt" es auch mit diesen noch immer nicht?

                Liebe Grüße,

                Felix Riesterer.

                Hallo Felix,

                nein auch damit geht es nicht ... :(

                1. Lieber Nullpeiler,

                  nein auch damit geht es nicht ... :(

                  dann soll es eben humpeln.

                  Liebe Grüße,

                  Felix Riesterer.

                  --
                  ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
                  1. dann soll es eben humpeln.

                    die Variable $treffer bleibt leer ... und außerdem Felix kann $treffer nciht angezeigt werden mit Deiner Version weil es ein arry ist, nur $treffer[x][y]
                    wird belegt, aber in diesemfall halt nicht ...

                    gibt es noch einen weg den Wert zwischen

                    "><div>

                    Diesen Text hier <br>
                    inkl. den <br>

                    </div>

                    auszulesen ?

                    Danke.

                    1. Lieber Nullpeiler,

                      die Variable $treffer bleibt leer ...

                      das bedeutet ein if-Zweig der Art if (empty($treffer)) { melde_fehler(); } würde ausgelöst werden?

                      und außerdem Felix kann $treffer nciht angezeigt werden mit Deiner Version weil es ein arry ist, nur $treffer[x][y]
                      wird belegt, aber in diesemfall halt nicht ...

                      Du kennst print_r() noch nicht?

                      gibt es noch einen weg den Wert zwischen

                      "><div>

                      Diesen Text hier <br>
                      inkl. den <br>

                      </div>

                      auszulesen ?

                      Dein String sah vorher aber anders aus! Jetzt hat das <div>-Element keine Klasse "reader" mehr, und das vorhergehende Element muss also irgendein Attribut gehabt haben... Das sind veränderte Anforderungen, auf die man ein neues Muster schreiben müsste!

                      Damit Du siehst, dass Du schon ein bisschen mitdenken musst, habe ich Dir etwas zusammengebastelt:

                      $html = '<!-- Anfang eines semantisch höchst fragwürdigen HTML-Codes -->  
                      <div class="rbb2cu">  
                          <div class="reader">  
                        
                      Diesen Text hier <br>  
                      inkl. den <br>  
                        
                          </div>  
                      </div>  
                      <!-- Ende eines semantisch höchst fragwürdigen HTML-Codes -->';  
                        
                      if (preg_match_all('@(?s)rbb2cu">[\r\n\t ]*<div class="reader">(.*?)</div@',$html, $treffer)) {  
                          echo "<pre>", print_r($treffer, true), "</pre>";  
                      } else {  
                          echo "<pre>Kein Match!</pre>";  
                      }
                      

                      Obiger Code ist getestet und liefert das gewünschte Ergebnis.

                      Liebe Grüße,

                      Felix Riesterer.

                      --
                      ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
                      1. Obiger Code ist getestet und liefert das gewünschte Ergebnis.

                        ... vielen Dank so stelle ich mir eine gute Antwort vor, Danke nochmal ;)

                        1. Lieber Nullpeiler,

                          Obiger Code ist getestet und liefert das gewünschte Ergebnis.

                          so stelle ich mir eine gute Antwort vor

                          Du hast anscheinend nix gelernt... schade!

                          Liebe Grüße,

                          Felix Riesterer.

                          --
                          ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
            2. Hi Nullpeiler!

              BOAH seit Ihr schlau ... m U s gierig oder nicht ... da kommt bei mir nur Bahnhof an ... und es klappt immer noch nicht ... f***

              Hast du auch Felix´ Lösungsvorschlag probiert?

              MfG H☼psel

              --
              "It's amazing I won. I was running against peace, prosperity, and incumbency."
              George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
              Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
      2. Wichtig sind auch die Modifier U und m.
        "U" für ein nicht gieriges Verhalten und "m", damit "." auch Zeilenumbrüche matcht.

        tutut pfpfpfpf ... Bahnhof ... Zeilenumbrüche sind schon wichtig aber ie hilft mir der "." jetzt weiter wo muss er stehen ?

        Thanks

    2. Felix Riesterer.

      thanks,

      aber $treffer ist leer, obwohl definitiv etwas zwischen den beiden
      tags seht.

      rbb2cu"><div class="reader">
      Diesen Text will ich haben <br> inklusive den <br's>
      </div>

      wenn ich jetzt nach Deiner und meiner Methode preg_match_all anwende,
      und die $treffer durchsuche mit z.B.

      for($y=1;$y<10;$y=$y+1)
       {
       print $treffer[0][$y];
        }

      kommt nichts, obwohl es in $treffer[0][0] stehen müsste.

      ... hat bestimmt etwas mit den Zeichen "><= zutun, welche muss ich
      mit \ ausschalten ?

      Thanks

      1. Hi Nullpeiler!

        ... hat bestimmt etwas mit den Zeichen "><= zutun, welche muss ich
        mit \ ausschalten ?

        Wie kommst du darauf?
        Diese Zeichen haben für sich und an dieser Position keine spezielle Bedeutung.

        Beachte aber meinen Hinweis.

        MfG H☼psel

        --
        "It's amazing I won. I was running against peace, prosperity, and incumbency."
        George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
        Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
    3. Ja, da hatte ich die Modifier übersehen (weil ungetestet):

      if (preg_match_all('@(?s)rbb2cu"><div class="reader">(.*?)</div@',$html, $treffer)) {  
      
      >     print_r($treffer);  
      > }  
      >   
      
      $gefunden = preg_match_all('@(?s)rbb2cu"><div class="reader">(.*?)</div@',$html, $treffer);  
      
      > if ($gefunden) {  
      >     print_r($treffer);  
      > }
      
      

      Liebe Grüße,

      Felix Riesterer.

      --
      ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)