Avatar billede Hans1 Praktikant
16. marts 2012 - 15:25 Der er 14 kommentarer

HTML udtræk med PHP

Hej
Er det muligt at udtrække følgende to rækker fra en HTML side?
Det ville være smart hvis det kunne komme i et foreach.

Jeg har fundet dette værktøj men jeg tror ikke at det kan springe de to første tables over:
http://simplehtmldom.sourceforge.net/

Der er vidst også en funktion kaldet: DOMXPath
Men det kan jeg heller ikke rigtigt få til at virke som det skal.


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html lang=EN-US>
<head>
<Meta Http-equiv="Content-Type" Content="text/html; CHARSET=UTF-8">
</head>

<table border="0" cellpadding="0" cellspacing="0">
  <tr>
    <td width="100%">
  <table border="0" width="100%" cellspacing="0" cellpadding="1">
      <tr>
        <td></td>
        <td></td>
      </tr>
    </table>
    </td>
  </tr>
  <tr>
    <td></td>
  </tr>
  <tr>
    <td>
<table width=100% border="0" cellspacing="0" cellpadding="2">

<!-- Kolonne -->

<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>

<!-- Kolonne Slut-->

<!-- 1. række som skal trækkes ud  -->

<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>

<!-- 1. række slut  -->

<!-- 2. række som skal trækkes ud -->

<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>

<!-- 2. række slut  -->

</table>

</td>
</tr>

</table>



</body>
</html>

Avatar billede rix Praktikant
16. marts 2012 - 15:38 #1
Hey er der altid 3 kolloner eller ??
Avatar billede Hans1 Praktikant
16. marts 2012 - 15:49 #2
Kolonner? 3?

Der er kun de 6 kolonner i tredje tabel.
Derefter kommer der en masse tr'er og td'er
Avatar billede olebole Juniormester
16. marts 2012 - 15:49 #3
<ole>

Det er næsten umuligt at udtale sig om, når man ikke ved, hvordan den reelle kode ser ud - og hvilke variationer der kan være

/mvh
</bole>
Avatar billede olebole Juniormester
16. marts 2012 - 15:51 #4
Er der altid tale om tredie kollonne i dokumentets første tabel?
Avatar billede Hans1 Praktikant
16. marts 2012 - 16:01 #5
Ja og i den reelle kode vil der bare være flere rækker end 2 som jeg har udkomenteret.
Avatar billede olebole Juniormester
16. marts 2012 - 16:21 #6
En knapt så elegant RegExp-løsning kunne se sådan ud:

<?php
$html = file_get_contents('test.html');

preg_match_all('/<table.*?>.+?<\/table>/s', $html, $matches);
preg_match_all('/<tr>.+?<\/tr>/s', $matches[0][1], $matches);

echo $matches[0][1].'<hr>';
echo $matches[0][2];
?>
Avatar billede Hans1 Praktikant
16. marts 2012 - 16:28 #7
Hmm jeg får 3 fejl:

Notice: Undefined offset: 1 in index.php on line 5

Notice: Undefined offset: 1 in index.php on line 7

Notice: Undefined offset: 2 in index.php on line 8
Avatar billede olebole Juniormester
16. marts 2012 - 16:32 #8
Nej, ikke udfra det øvrige, du fortæller
Avatar billede olebole Juniormester
16. marts 2012 - 16:52 #9
Der må være noget galt med den tabelstruktur, du viser, hvis du får de fejl. Prøv at lægge et link til det dokument, du faktisk skal parse
Avatar billede Hans1 Praktikant
16. marts 2012 - 17:19 #10
Dette er det tætteste jeg er kommer.
Problemet er bare at den tager kolonnen med.

<!-- Kolonne -->

<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>

<!-- Kolonne Slut-->





[div]

$html = str_get_html('html.html');

$formated = $html->find('table', -1);

   

/*** a new dom object ***/
    $dom = new domDocument;

    /*** load the html into the object ***/
    @$dom->loadHTML($formated);

    /*** discard white space ***/
    $dom->preserveWhiteSpace = false;

    /*** the table by its tag name ***/
    $tables = $dom->getElementsByTagName('table');

    /*** get all rows from the table ***/
    $rows = $tables->item(0)->getElementsByTagName('tr');

    /*** loop over the table rows ***/
    foreach ($rows as $row)
    {
        /*** get each column by tag name ***/
        $cols = $row->getElementsByTagName('td');
        /*** echo the values ***/
        echo $cols->item(0)->nodeValue.'<br />';
        echo $cols->item(1)->nodeValue.'<br />';
        echo $cols->item(2)->nodeValue.'<br />';
    echo $cols->item(3)->nodeValue.'<br />';
    echo $cols->item(4)->nodeValue.'<br />';
    echo $cols->item(5)->nodeValue.'<br />';
        echo '<hr />';
    }
?>
[div]
Avatar billede olebole Juniormester
16. marts 2012 - 17:22 #11
Du svarer ikke på det, du bliver spurgt om
Avatar billede Hans1 Praktikant
16. marts 2012 - 22:47 #12
Sorry min fejl nu får jeg ikke fejl.
Er det muligt at kombinere det med en løkke eller foreach?
Avatar billede olebole Juniormester
17. marts 2012 - 01:14 #13
Det må vel være noget i stil med:

$html = file_get_contents('test.html');

preg_match_all('/<table.*?>.+?<\/table>/s', $html, $matches);
preg_match_all('/<tr>.+?<\/tr>/s', $matches[0][1], $matches);

$arr = $matches[0];
for ($i=0,$j=count($arr); $i<$j; $i++) {
    echo $arr[$i];
}
Avatar billede Hans1 Praktikant
17. marts 2012 - 10:43 #14
Det ser godt ud, men er det muligt at man ikke får td'erne og tr'erne med?
Kan man via preg_match_all gøre så man får hver enkel td pr loop i en vaiabel?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester