Deel HTML uitlezen en echo'en
Ik heb een externe URL in HTML en wil hier een deel van kopieëren, zonder het bovenste en onderste deel.
Nou weet ik dat je met PHP RSS feeds kunt uitlezen en echo'en op je site, maar is dit ook met een deel HTML mogelijk?
Ik wil alles binnen de eerste <table> en de eerste </table> echo'en.
Ik heb zelf natuurlijk al wat onderzoek verricht, maar kwam niet verder dan een HTML Parser: http://php-html.sourceforge.net/ die volgens mij alleen maar de 'technische' info leest van een pagina.
Is het mogelijk? Of kan ik het vergeten?
Nou weet ik dat je met PHP RSS feeds kunt uitlezen en echo'en op je site, maar is dit ook met een deel HTML mogelijk?
Ik wil alles binnen de eerste <table> en de eerste </table> echo'en.
Ik heb zelf natuurlijk al wat onderzoek verricht, maar kwam niet verder dan een HTML Parser: http://php-html.sourceforge.net/ die volgens mij alleen maar de 'technische' info leest van een pagina.
Is het mogelijk? Of kan ik het vergeten?
Je kan dit scriptje gebruiken om tables te parsen.
Geavanceerdere operaties (ook simpelere) zijn ook met de php Dom extensie te doen:
http://nl3.php.net/dom
Deze bied een javascript achitge interface voor html documenten
Geavanceerdere operaties (ook simpelere) zijn ook met de php Dom extensie te doen:
http://nl3.php.net/dom
Deze bied een javascript achitge interface voor html documenten
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?
$string = '<table><tr><td>Rij 1 Waarde1</td><td>Rij 2 Waarde 2</td></tr><tr><td>Rij 2 Waarde 1</td><td>Rij 2 Waarde 2</td></tr></table>
<table><tr><td>Tabel 2, Rij 1 Waarde1</td><td>Rij2 Waarde2</td></tr><tr><td>Rij 2 Waarde 1</td><td>Rij 2 Waarde 2</td></tr></table>';
preg_match_all('|<table(:\s?.+?)?' . '>(.+?)</table>|i', $string, $aTablesSource);
// Bovenste regel bevat de concatation ' . ' omdat de syntax highlighter anders flipt
$aTablesSource = $aTablesSource[2];
//print_r($aTables);
$aTables = array();
$iTables = 0;
foreach ($aTablesSource as $sRows) {
preg_match_all('|<tr(:\s?.+?)?' . '>(.+?)</tr>|i', $sRows, $aRowSource);
$aRowSource = $aRowSource[2];
$iRows = 0;
foreach ($aRowSource as $sCells) {
preg_match_all('|<td(:\s?.+?)?' . '>(.+?)</td>|i', $sCells, $aCellSource);
//print_r($aCellSource);
$aCellSource = $aCellSource[2];
$aTables[$iTables][$iRows++] = $aCellSource;
}
$iTables++;
}
print_r($aTables);
?>
$string = '<table><tr><td>Rij 1 Waarde1</td><td>Rij 2 Waarde 2</td></tr><tr><td>Rij 2 Waarde 1</td><td>Rij 2 Waarde 2</td></tr></table>
<table><tr><td>Tabel 2, Rij 1 Waarde1</td><td>Rij2 Waarde2</td></tr><tr><td>Rij 2 Waarde 1</td><td>Rij 2 Waarde 2</td></tr></table>';
preg_match_all('|<table(:\s?.+?)?' . '>(.+?)</table>|i', $string, $aTablesSource);
// Bovenste regel bevat de concatation ' . ' omdat de syntax highlighter anders flipt
$aTablesSource = $aTablesSource[2];
//print_r($aTables);
$aTables = array();
$iTables = 0;
foreach ($aTablesSource as $sRows) {
preg_match_all('|<tr(:\s?.+?)?' . '>(.+?)</tr>|i', $sRows, $aRowSource);
$aRowSource = $aRowSource[2];
$iRows = 0;
foreach ($aRowSource as $sCells) {
preg_match_all('|<td(:\s?.+?)?' . '>(.+?)</td>|i', $sCells, $aCellSource);
//print_r($aCellSource);
$aCellSource = $aCellSource[2];
$aTables[$iTables][$iRows++] = $aCellSource;
}
$iTables++;
}
print_r($aTables);
?>
Ik zie in je code allerlei tabellen staan, maar volgens mij snap je niet wat ik wil.
Ik heb http://www.extern.nl/schema.html
en http://www.eigen.nl/verzameling.php
Uiteindelijk wil ik eigenlijk zoiets bereiken:
---------
schema.html
<h1>Schema</h1>
<table><tr><td>Uren</td></tr></table>
verzameling.php (output)
meuk <br> meer meuk <br>
<table><tr><td>Uren</td></tr></table>
---------
Ik wil dus een deel van een HTML pagina als het waren 'embedden' in een andere pagina.
Ik heb http://www.extern.nl/schema.html
en http://www.eigen.nl/verzameling.php
Uiteindelijk wil ik eigenlijk zoiets bereiken:
---------
schema.html
<h1>Schema</h1>
<table><tr><td>Uren</td></tr></table>
verzameling.php (output)
meuk <br> meer meuk <br>
<table><tr><td>Uren</td></tr></table>
---------
Ik wil dus een deel van een HTML pagina als het waren 'embedden' in een andere pagina.
Hiermee haal je in ieder geval alle tabellen html op uit een pagina. Hoe je verder de precieze tabel pakt die je nodig hebt, mag je zelf uitpluizen ;-)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
function open_url ($url) {
$fp = fopen ($url, 'r');
$html = '';
if ($fp) {
while ($str = fgets ($fp, 8192)) {
$html .= $str;
}
fclose ($fp);
return $html;
}
else {
return false;
}
}
$string = open_url ('http://www.phphulp.nl/');
preg_match_all('/\<table.*\>.*\<\/table\>/i', $string, $tables);
echo '<pre>' . htmlentities (print_r ($tables[0], true)) . '</pre>';
// die htmlentities is alleen om de html op het scherm goed weer te geven.
// later mag die er uit
?>
function open_url ($url) {
$fp = fopen ($url, 'r');
$html = '';
if ($fp) {
while ($str = fgets ($fp, 8192)) {
$html .= $str;
}
fclose ($fp);
return $html;
}
else {
return false;
}
}
$string = open_url ('http://www.phphulp.nl/');
preg_match_all('/\<table.*\>.*\<\/table\>/i', $string, $tables);
echo '<pre>' . htmlentities (print_r ($tables[0], true)) . '</pre>';
// die htmlentities is alleen om de html op het scherm goed weer te geven.
// later mag die er uit
?>
Gewijzigd op 01/01/1970 01:00:00 door Jan Koehoorn
Kleine nit-pick:
Zorg dat je quantifiers (*) non greedy zijn: dus *?.
Anders matched de onderstaande regex van de eerste tot de laatste table, en niet elke afzonderlijke table apart.
Zorg dat je quantifiers (*) non greedy zijn: dus *?.
Anders matched de onderstaande regex van de eerste tot de laatste table, en niet elke afzonderlijke table apart.
Mag ik ook een zetje doen? include
schema.html
verzameling.php (output)
schema.html
verzameling.php (output)
Maar dan heb je ook die H1, en ik wil alleen het tabel. Ben al een beetje aan het kloten met die preq_match_all, maar is nog knap lastig.




