Andreas: Hilfe bei regulärem Ausdruck

Hallo!
Ich versuche für einen Online-Shop, der teileweise Produkte über ebay versteigert, seine aktuelle Übersichtstabelle mit einem regulären Ausdruck einzulesen. Das funktioniert aber nicht.

ich will alles was zwischen

Höchstbietender/Status
</th>
</tr>

und

</table>

steht auslesen. Mein Versuch:

preg_match ( "/Höchstbietender/Status\s*</th>\s*</tr>\s*(.*?)</table>/i", $html_body , $result);

Wie gesagt, $result ist ein leerer array.

Kann mir jemand sagen was ich falsch mache?

Grüße
Andreas

PS: Ist so sichergestellt das nach dem _nächten_ </table> gesucht wird und nicht nach dem letzten?

  1. Hallo!

    Tach.

    Ich versuche für einen Online-Shop, der teileweise Produkte über ebay versteigert, seine aktuelle Übersichtstabelle mit einem regulären Ausdruck einzulesen. Das funktioniert aber nicht.

    Weil HTML nicht mit regulären Ausdrücken zu parsen ist.

    ich will alles was zwischen

    Höchstbietender/Status
    </th>
    </tr>

    und

    </table>

    steht auslesen. Mein Versuch:

    preg_match ( "/Höchstbietender/Status\s*</th>\s*</tr>\s*(.*?)</table>/i", $html_body , $result);

    Ein einfaches title="</table>" Attribut (wobei natürlich der Name des Attributs zweitrangig ist) zerlegt Dir Deinen Suchversuch. Weil HTML eben nicht mit regulären Ausdrücken zu parsen ist.

    Andreas

    1. Hallo!

      Weil HTML nicht mit regulären Ausdrücken zu parsen ist.

      hab ich aber schonmal geschafft!?

      ich will alles was zwischen

      Höchstbietender/Status
      </th>
      </tr>

      und

      </table>

      steht auslesen. Mein Versuch:

      preg_match ( "/Höchstbietender/Status\s*</th>\s*</tr>\s*(.*?)</table>/i", $html_body , $result);

      Ein einfaches title="</table>" Attribut (wobei natürlich der Name des Attributs zweitrangig ist) zerlegt Dir Deinen Suchversuch.

      Hä? Was soll das sein? Das kommt definitiv nicht vor, außerdem wäre es egal da vor title garantiert kein </tr> kommt. Ich will von einer ganz bestimmten html-Seite nur ein paar Tabellenzeilen extrahieren. Ich habe z.B. erfolgreich von der Yahoo Finanz-Seite Böresenkures extrahiert, Du gibst eine WKN ein und bekommst den aktuellen Börsenkurs. Das war genau dasselbe, nur das ich diesemal nicht nur einen Wert haben will, sondern direkt x Zeilen.

      Weil HTML eben nicht mit regulären Ausdrücken zu parsen ist.

      Wenn Du mir das nicht glaubst, such dir z.B. hier eine WKN aus: http://de.finance.yahoo.com/q?s=@^mdaxi&o=S, also z.B. 755140 für Beate Uhse XETRA.
      Dann gib die hier ein, beachte das ich den Xetra-Kurs abfrage:
      http://www.knet-systems.de/kurse.php

      Das war aber nur eine Spielerei, nicht das jemand denkt ich wollte das   irgendwie verwenden ;-)

      Genau dasselbe müßte doch auch mit ebay funktionieren, oder?

      Viele Grüße
      Andreas

      1. Hallo nochmal!

        Ich habe hier mal den html-Code, den ich haben möchte:

        Höchstbietender/Status
        </th>
        </tr>
        <tr bgcolor="#ffffff">
        <td><a href="
        http://cgi.ebay.de/ws/eBayISAPI.dll?ViewItem&item=
        1750943698">1750943698</a></td>
        <td align="center">17.07.02</td>
        <td>24.07.02 19:40:53</td>
        <td align="right"><b>EUR 153,00</b></td>
        <td>
        <font color="">Carguard Pentagon Standard, neu </font>
        </td>
        <td align="center"><a href="http://contact.ebay.de/aw-cgi/eBayISAPI.dll?ReturnUserEmail&requested=player218&iid=1750943698&frm=285">player218</a>

        <a href="
        http://cgi2.ebay.de/aw-cgi/eBayISAPI.dll?ViewFeedback&userid=
        player218">(0)</a></td>
        </tr>
        <tr bgcolor="#efefef">
        <td><a href="
        http://cgi.ebay.de/ws/eBayISAPI.dll?ViewItem&item=
        1750957894">1750957894</a></td>
        <td align="center">17.07.02</td>
        <td>24.07.02 20:24:11</td>
        <td align="right"><b>EUR 101,00</b></td>
        <td>
        <font color="">M-Look Spiegel mit Blinker, Carbon, neu </font>
        </td>
        <td align="center"><a href="http://contact.ebay.de/aw-cgi/eBayISAPI.dll?ReturnUserEmail&requested=tuning_luder&iid=1750957894&frm=285">tuning_luder</a>

        <a href="
        http://cgi2.ebay.de/aw-cgi/eBayISAPI.dll?ViewFeedback&userid=
        tuning_luder">(0)</a></td>
        </tr>
        </table>

        ich möchte alles nach dem ersten <tr> und dem letzten <tr> haben.

        Höchstbietender/Status
        </th>
        </tr>

        am Anfang kommt so nur einmal vor,

        </table>

        kommt an dieser Stelle als nächstes vor.

        Ich habe es jetzt mal so probiert:

        preg_match ( "/Status\s*</th>\s*</tr>\s*([a-zA-Z0-9äöüÄÖÜ=<>"#\s.;_-])\s*</table>/i", $html_body , $result);

        Aber das gibt ergibt auch nichts.

        Das Problem sind ist das ich auch <tr>, <td>... haben möchte, und das viele Zeilenumbrüche vorkommen. Oder sollte ich den Quellcode vorher von solchen Sachen bereinigen?

        Theoretisch müßte es auch so gehen, nru kenne ich die regulären Ausdrücke noch nicht gut genug, was könnte ich noch versuchen?

        Grüße
        Andreas

        1. Hi,

          Theoretisch müßte es auch so gehen, nru kenne ich die regulären Ausdrücke noch nicht gut genug, was könnte ich noch versuchen?

          Du könntest es ja mal mit substring probieren.
          Da du alles nach dem ersten tr und vor dem letzten tr brauchst,
          kannst du schön mit strpos() die Position des ersten tr ermitteln.
          Die Position des letzeten müsste auch mit ner Funktion möglich sein, hab ich aber gerade nicht im Kopf.

          Dann musst du nur noch mit substring den gewünschten Bereich "ausschneiden".

          Hoffe das Hilft dir weiter.

          Gruß

          ueps

          1. Hallo!

            Du könntest es ja mal mit substring probieren.

            Auf die Idee bin ich noch gar nicht gekommen;-)

            Da du alles nach dem ersten tr und vor dem letzten tr brauchst,
            kannst du schön mit strpos() die Position des ersten tr ermitteln.

            Ja, aber leider gibt es davor noch ein paar <tr>! Ich habe nur den Ausschnitt der Seite gepostet, den ich mit einem regulären Ausdruck extrahiern möchte.

            Die Position des letzeten müsste auch mit ner Funktion möglich sein, hab ich aber gerade nicht im Kopf.

            Ja, da gibt es schon was, aber wie gesagt brauche dazu erstmal diesen Ausschitt des Codes, und wenn ich den bekomme, kann ich ja den Teil dazuwischen einfach in () setzen und habe es direkt als String zur Verfügung, aber leider schaffe ich es nicht. Das _muss_ gehen, aber irgendwo ist ein (wahrscheinlich einige) Fehler in meinem Ausdruck.

            Grüße
            Andreas

            1. Hi,

              Da du alles nach dem ersten tr und vor dem letzten tr brauchst,
              kannst du schön mit strpos() die Position des ersten tr ermitteln.
              Ja, aber leider gibt es davor noch ein paar <tr>! Ich habe nur den Ausschnitt der Seite gepostet, den ich mit einem regulären Ausdruck extrahiern möchte.

              Du musst ja nicht unbedingt _nur_ die Position des tr's ermitteln, nimm doch einfach "Höchstbietender/Status" um die Position zu ermitteln.

              Gruß

              ueps

              1. Hallo!

                Du musst ja nicht unbedingt _nur_ die Position des tr's ermitteln, nimm doch einfach "Höchstbietender/Status" um die Position zu ermitteln.

                Hast Recht, da bin ich auch kurz nach abschicken drauf gekommen, hab das mal so gemacht:

                $pos = strpos($html_body,"/Status") + 23;
                $datensaetze = substr($html_body,$pos,strpos(substr($html_body,$pos),"</table>"));

                Aber es ist einfach ärgerlich wenn man genau weiß das es mit einem einfachen Regulären Ausdruck auch funktionieren würde und man selbst einfach zu blöd ist so einen Ausdruck hinzubekommen ;-)

                Aber nochmal zurück zu den Regulären Ausdrücken(vielleicht kennt ja jemand die Lösung;-) ich habe wenigstens ein paar Sachen mit regulären Ausdrücken herausgeschnitten:

                $datensaetze = preg_replace ("/[\n\r]/i", "", $datensaetze);
                $datensaetze = preg_replace ("/ bgcolor="#\w{6}"/i", "", $datensaetze);
                $datensaetze = preg_replace ("/</?b>/i", "", $datensaetze);
                $datensaetze = preg_replace ("/^<tr><td>/i", "", $datensaetze);
                $datensaetze = preg_replace ("/</td></tr>$/i", "", $datensaetze);
                $datensaetze = preg_replace ("/</?a(.*?)>/i", "", $datensaetze);

                Kann man den wenigstens das ein wenig zusammenfassen? Oder ist es egal wenn man so viele reguläre Ausdrücke hintereinander schreibt? Obwoll das so ja wenigstens einigermaßen übersichtlich ist ;-)

                Das gute ist jetzt, ich kann mit explode() erstmal die Zeilen teilen, und dann nochmal die Spalten, so komme ich an einen mehrdimensionalen Array, der die blanken Daten enthält ;-)

                Grüße
                Andreas