Frank S: HTML parsen mit PHP

Hallo!

Ich möchte gerne aus dem Quelltext einer anderen Homepage einen Teil "herausschneiden" und bei mir verwenden. Konkret will ich eine Tabelle, die wie folgt aufgebaut ist, einlesen:

<table class="result-set" cellpadding=0 border=0 cellspacing=0>
.
.
.
</table>

Dazu habe ich folgende Anweisung benutzt:
preg_match("!<table class="result-set" cellpadding=0 border=0 cellspacing=0>(.*?)</table>!",$start,$str);

Davor lese ich die Seite wie folgt ein:
$start = implode(' ',file ('http://...'));

Das Ergebnis ist allerdings, dass die Variable $str leer ist, also nichts gefunden wurde. Wenn ich den Parameter $start manuell mit einem String belege, der zu dem Suchmuster passt, funktioniert es.
Was mache ich falsch?

Gruß,
Frank

  1. Davor lese ich die Seite wie folgt ein:
    $start = implode(' ',file ('http://...'));

    Das Ergebnis ist allerdings, dass die Variable $str leer ist, also nichts gefunden wurde. Wenn ich den Parameter $start manuell mit einem String belege, der zu dem Suchmuster passt, funktioniert es.
    Was mache ich falsch?

    bei dir geht offenbar etwas beim lesen des files schief

    file und implode scheint mir etwas unnötig zu sein, wenn du den inhalt eines files in einen string einlesen willst, solltest du file_get_contents

    wie wärs mal dem, um zu sehen, ob die variable $start überhaupt befüllt wird

    $start = file_get_contents('http://www.example.com/')  
    $var_dump($start);
    
  2. Hi,

    obwohl (oder weil?) PHP schwach typisiert ist, überprüfe den Typ des Rückgabewertes von implode und vergleiche ihn mit den Parametern, die preg_match entgegen nimmt.
    Darüber hinaus hilft dir vielleicht der Regex-Tester.

    Der Yeti

    1. Hi,

      sorry, explode und implode durcheinander gewürfelt. Wie suit schon angemerkt hat: Heutzutage liest man Dateien mit file_get_contents ein
      Regex Tester kann dir aber helfen.

      Der Yeti

    2. Darüber hinaus hilft dir vielleicht der Regex-Tester.

      ich verwende persönlich gerne den hier

      1. Ok, ich lese die Daten jetzt über file_get_contents aus, allerdings klappt es damit genauso wenig.

        Ich kenne mich mit regulären Ausdrücken in PHP leider nicht so gut aus. Kann mir vielleicht mal jemand konkret erklären, wie ich von folgender Homepage alles erhalte was zwischen

        <table class="result-set" cellpadding=0 border=0 cellspacing=0>
        und
        </table>

        steht?

        Die Homepageadresse lautet: http://dttb.click-tt.de/cgi-bin/WebObjects/ClickNTTV.woa/wa/groupPage?championship=DTTB+08/09&group=68022

        1. Ok, ich lese die Daten jetzt über file_get_contents aus, allerdings klappt es damit genauso wenig.

          WAS klappt nicht

          Ich kenne mich mit regulären Ausdrücken in PHP leider nicht so gut aus.

          das ist momentan nicht dein problem - analysiere die einzelschritte deines problems

          du willst also folgende teilschritte machen
          a) inhalt einlesen
          b) inhalt herrausschneiden
          c) inhalt umkrempeln und ausgeben

          das ganze läuft prozedural ab, dh du kannst b erst erfüllen, wenn a erledigt ist usw

          sehen wir uns nochmal a) genauer an:

          1. ressource ist "http://example.com/"
          2. der inhalt soll in einen string gespeichert werden
            2a) zum debugging gibst du den jetzt eingelesenen string aus (echo $meinstring;) sowie var_dump($meinstring);

          wenn das zu deiner zufriedenheit funktioniert und du sicherstellen kannst, dass dieser teil deiner prozedur funktioniert, gehe zum nächste teil b) inhalt herrausschneiden über (da brauchst du dann vermutlich einen regulären ausdruck oder ggf. reicht aber auch ein xml-parser wobei ein solcher bei der fehlerzahl des genannten dokuments sicher die patschen aufstellt)

          Die Homepageadresse lautet: http://dttb.click-tt.de/cgi-bin/WebObjects/ClickNTTV.woa/wa/groupPage?championship=DTTB+08/09&group=68022

          das ist keine adresse, das ist ein zustand ;) wer solche urls generiert, gehört eingesperrt

          im übrigen: du solltest dir auf jeden fall die erlaubnis holen, den inhalt automatisiert einzulesen - dürfen tust du das nämlich nicht ohne weiteres (urheberrechtsverletzung)

          1. Wie kann ich Spalten in Tabellen mit regulären Ausdrücken löschen?

            Also z.B. so was:

              
            $tabelle = "<table border=\"1\">  
                          <tr>  
                     <td>Erste Spalte</td>  
                            <td>Zweite Spalte</td>  
                   </tr>  
                        </table>";  
              
            $tabelle = preg_replace("!<tr><td>(.*?)</td><td>(.*?)</td></tr>!","<tr><td>$1</td></tr>",$tabelle);  
            
            

            Das ganze Soll die zweite Zeile löschen, klappt aber natürlich nicht.
            Wie konkret sieht eine Anweisung aus, die die zweite Spalte löscht?

            1. Wie kann ich Spalten in Tabellen mit regulären Ausdrücken löschen?

              suche beide feldinhalte und schreibe die beiden feldinhalte in ein feld

              Das ganze Soll die zweite Zeile löschen, klappt aber natürlich nicht.

              Wie konkret sieht eine Anweisung aus, die die zweite Spalte löscht?

              ein grundlegender fehler ist schonmal, dass du einfach annimmst, dein suchmuster träfe zu

              analysieren wir mal den ersten teil deines ausdrucks

              <tr><td>(.*?)</td><td>

              du erwartest jetzt, dass dieser auf folgenden stringteil zutrifft?

              <tr>  
                        <td>Erste Spalte</td>  
                               <td>
              

              weiters erwartest du, dass du 2 gefundene zeichenketten, die du mit (.*?) (irgendwas oder nix) ausliest, in eine zeichenkette schreibst $1 - wenn du 2 zeichenketten findest, solltest du auch 2 wieder einfügen $1$2

              dein logischer ansatz ist ist prinzipiell richtig, nur vergisst du dabei, dass du zwischen den tags der tabelle umbrüche hast

        2. Hi,

          Ich kenne mich mit regulären Ausdrücken in PHP leider nicht so gut aus.

          brauchst Du auch gar nicht. strpos() und substr() reichen dazu völlig.

          freundliche Grüße
          Ingo

          1. Ich kenne mich mit regulären Ausdrücken in PHP leider nicht so gut aus.
            brauchst Du auch gar nicht. strpos() und substr() reichen dazu völlig.

            es kommt immer auf das vorhaben drauf an - wenn du aus eine fertigen tabelle alle zeilen in eine datenbank schreiben willst und jede spalte in ein eigenes datenbankfeld, dann mahlzeit, wenn du dich mit strpos und substr duch die tabelle hangelst ;)

            im falle einer einzelnen tabelle, die noch dazu eine so markante, einleitende zeile hat, ist aber diese variante durchaus einfacher, da stimme ich zu