HTML Dateien auslesen
Shaguar
- php
0 suit0 seth_not@home0 Shaguar
0 Shaguar0 suit
Hallo zusammen,
aaalso, ich habe ein HTML Datei die eine Tabelle mit Daten enthält, diese Daten will ich nun mit PHP auslesen und in eine passende SQL Tabelle schreiben.
Was mir fehlt ist einfach eine zündende Idee, also wie ich die Datei einlese und wie ich in eine Datenbank speichere ist mir alles klar, das Problem ist nur das finden und zuordnen der Tabellen-Daten aus der HTML Datei. Also wie soll/kann ich da vorgehen, soll ich die Datei erstmal mit mit file_get_contents in eine String laden und mit dem dann arbeiten oder soll ich jede Zeile einzeln durchgehen, ich weiss einfach noch nicht so recht wie ich anfangen soll. Wäre super wenn mir einer von euch da auf die Sprünge helfen könnte.
Danke, Mfg.
die frage ist in erster linie, wie sauber die tabelle daherkommt
wenn der Code fehler enthalten KANN, sprich du content grabbing bei einer fremden Seite betreibst, kannst du vernünftige lösungen vergessen
wenn der code defintiv valide ist, versuchs mit mit den DOM-Funktionen von PHP
eine alternative ist dann noch mit regulären ausdrücken zu arbeiten (preg_match ist hier dein freund) damit suchst du alles zwischen <tr> und </tr>, dort nimmst du dir dann die werte zwischen <td></td> raus und hast dann ein array pro tabellenzeile
um zb <tr class="123"> oder <tr> oder <tr class=hallo> zu finden sollte folgender Ausdruck ausreichen /<tr(.*)>/ (kein Anspruch auf vollständigkeit)
gudn tach!
um zb <tr class="123"> oder <tr> oder <tr class=hallo> zu finden sollte folgender Ausdruck ausreichen /<tr(.*)>/ (kein Anspruch auf vollständigkeit)
besser: greedy und ohne klammern: /<tr.*?>/
prost
seth
gudn tach!
um zb <tr class="123"> oder <tr> oder <tr class=hallo> zu finden sollte folgender Ausdruck ausreichen /<tr(.*)>/ (kein Anspruch auf vollständigkeit)
besser: greedy und ohne klammern: /<tr.*?>/
prost
seth#
Ja aber mal ne ganz dumme Frage, wie bekomm ich denn von preg_match_all ein Ergebnis, die Funktion liefert doch nur einen Int zurück ob was gefunden wurde und wieviel.
Also perfekt wäre natürlich ein mehrdim. Array in dem alle Werte drinstehen.
gudn tach!
Ja aber mal ne ganz dumme Frage, wie bekomm ich denn von preg_match_all ein Ergebnis, die Funktion liefert doch nur einen Int zurück ob was gefunden wurde und wieviel.
in anbetracht der erklaerung im manual stimme ich dir bzgl. deine einstufung deiner frage zu. ;-p
iow: schau dir den dritten parameter mal an:
http://de.php.net/manual/en/function.preg-match-all.php
Also perfekt wäre natürlich ein mehrdim. Array in dem alle Werte drinstehen.
das array ist zwar tatsaechlich mehrdim. aber nicht so, wie du es gerne haettest. wenn die tabelle in jeder zeile gleich viele zellen besitzt (also kein colspan- oder rowspan-gedoens), laesst das aber trotzdem noch recht einfach handlen. ich schreibe mal den vereinfachten code hin:
preg_match_all('~<td>(.*?)</td>~', $html, $array);
in $array[1, 0..n-1] stehen jetzt alle zellen der tabelle drin. wenn die tabelle p zeilen und q spalten besitzt, dann ist n=p*q die menge aller zellen. und darueber kann man auch gezielt auf die zellen zugreifen: der inhalt der zelle in der i-ten zeile und j-ten spalte ist einfach $array[1, i*q+j]. (dabei habe ich sowohl bei der tabelle als auch beim array bei 0 angefangen zu zaehlen!)
mit dieser beziehung kannst du dann recht fix eine sql-tabelle befuellen.
prost
seth
preg_match_all('~<td>(.*?)</td>~', $html, $array);
in $array[1, 0..n-1] stehen jetzt alle zellen der tabelle drin [...]
irgendwie kann ich dem nict folgen - preg_match_all produziert doch ein mehrdimensionales array?
0 ist jeweils der komplette gefundene string und in weiteren keys werden die entsprechenden variablen aus den klammern hinterlegt
hier zb das ergebnis
<table>
<tr><td>123</td><td>456</td><td>789</td><td>000</td></tr>
<tr><td>abc</td><td>def</td><td>ghi</td><td>zzz</td></tr>
</table>
preg_match_all(
'/\<tr\>\<td\>(.*?)<\/td\><td\>(.*?)<\/td\><td\>(.*?)<\/td\><td\>(.*?)<\/td\>\<\/tr\>/is',
$str,
$parts
);
print_r($parts);
(
[0] => Array
(
[0] => <tr><td>123</td><td>456</td><td>789</td><td>000</td></tr>
[1] => <tr><td>abc</td><td>def</td><td>ghi</td><td>zzz</td></tr>
)
[1] => Array
(
[0] => 123
[1] => abc
)
[2] => Array
(
[0] => 456
[1] => def
)
[3] => Array
(
[0] => 789
[1] => ghi
)
[4] => Array
(
[0] => 000
[1] => zzz
)
)
gudn tach!
preg_match_all('~<td>(.*?)</td>~', $html, $array);
in $array[1, 0..n-1] stehen jetzt alle zellen der tabelle drin [...]irgendwie kann ich dem nict folgen - preg_match_all produziert doch ein mehrdimensionales array?
ja, mit $array[1, 0..n-1] meinte ich
$array[1, 0]
$array[1, 1]
...
$array[1, n-1]
/<tr><td>(.*?)</td><td>(.*?)</td><td>(.*?)</td><td>(.*?)</td></tr>/is
klar, das geht auch, aber ist nicht besonders flexibel (bei variierender spaltenanzahl), deshalb war mein vorschlag ~<td>(.*?)</td>~, d.i. dasselbe wie /<td>(.*?)</td>/.
prost
seth
Ok danke schon mal,
also ich grabbe nichts von anderen Seiten, ich lese nur HTML Dateien ein die ich selbsst erstellt habe, in diesem Fall wird die HTML Datei dann über ein Input Feld selbst hochgeladen.
preg_match ist hier dein freund
grade gesehen: preg_match_all ist natürlich ein viel besserer freund, wenn du mehrere treffer in ein array haben willst ;)