HTML parsen mit PHP
Frank S
- 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
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);
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
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
Darüber hinaus hilft dir vielleicht der Regex-Tester.
ich verwende persönlich gerne den hier
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
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:
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)
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?
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
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
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