Deel HTML uitlezen en echo'en
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?
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 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.
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
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.
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.