2015-06-28 16 views
6

einfacher HTML-Code ist hier.Wie HTML in PHP eleganter zu analysieren?

<table> 

<tr><th>Name</th><th>Price</th><th>Country</th></tr> 
<tr><td><a href="bbb/111">Apple</a></td><td>500</td><td>America</td></tr> 
<tr><td><a href="bbb/222">Samsung</a></td><td>400</td><td>Korea</td></tr> 
<tr><td><a href="bbb/333">Nokia</a></td><td>300</td><td>Finland</td></tr> 
<tr><td><a href="bbb/444">HTC</a></td><td>200</td><td>Taiwan</td></tr> 
<tr><td><a href="bbb/555">Blackberry</a></td><td>100</td><td>America</td></tr> 

</table> 

Was ich tun möchte, ist die Verschrottung Firmennamen und seinen Preis. so was.

Apple 500/Samsung 400/Nokia 300/HTC 200/Blackberry 100 

Also verwende ich PHP-Parser. Ich weiß, es gibt viele PHP-Parser-Plugin, aber die Leute sagen, es ist besser, Original-PHP-Parser zu verwenden. also Code ich so.

$source_n = file_get_contents($html); 
$dom = new DOMDocument(); 
@$dom->loadHTML($source_n); 
$stacks = $dom->getElementsByTagName('table')->item(0)->textContent; 
echo $stacks; 

wird es viele String-Werte angezeigt .... so.

Name Price Country Apple 500 America Samsung 400 Korea ...... 

Es ist sehr glaube ich, nicht sinnvoll Codierung, wenn ich wie oben kodieren, sollte ich() Funktion explodieren, und der Code wird schmutziger als jetzt.

Wie kann ich eleganter verschrotten? Gibt es eine einfache Referenz?

Antwort

3

Verwenden DOMXPath::query, sammeln alle Namen zuerst

$selector = new DOMXPath($dom); 

$results = $selector->query('//td/a'); 

foreach($results as $node) { 
    echo $node->nodeValue . PHP_EOL; 
} 

Dann Preise nach, indem

$results = $selector->query('//td[2]'); 

Sandbox Probe here

1

Die beste Lösung, die ich für das Parsen von HTML gefunden symfony's Dom crawler verwendet Komponente. Zusammen mit dem CSS-Selektor können Sie HTML so filtern, wie Sie eine Klasse in Javascript auswählen würden. Zum Beispiel alle p Elemente zu bekommen, tun:

$crawler = $crawler->filter('body > p'); 
0

Wenn Sie nicht wollen, verwenden DOMXPath::query

<?php 

$html = '<table> 
      <tr><th>Name</th><th>Price</th><th>Country</th></tr> 
      <tr><td><a href="bbb/111">Apple</a></td><td>500</td><td>America</td></tr> 
      <tr><td><a href="bbb/222">Samsung</a></td><td>400</td><td>Korea</td></tr> 
      <tr><td><a href="bbb/333">Nokia</a></td><td>300</td><td>Finland</td></tr> 
      <tr><td><a href="bbb/444">HTC</a></td><td>200</td><td>Taiwan</td></tr> 
      <tr><td><a href="bbb/555">Blackberry</a></td><td>100</td><td>America</td></tr> 
     </table>'; 

$dom = new DOMDocument(); 
$dom->loadHTML($html); 

//Get tables 
$tables = $dom->getElementsByTagName('table'); 

//Get tr out of first table 
$tableRows = $tables->item(0)->getElementsByTagName('tr'); 

//iterate over tablerows 
foreach($tableRows AS $tableRow){ 

    //Get tableData 
    $tableData = $tableRow->getElementsByTagName('td'); 

    //check to see if there is tableData 
    if($tableData->length >0){ 

     //Output first and second tableData 
     echo $tableData->item(0)->nodeValue . " " . $tableData->item(1)->nodeValue . "<br>"; 

    } 

} 

?>