1

少し問題があります。
PHP で単純な HTML ドキュメントを解析したいと考えています。簡単な HTML は次のとおりです。

<html>
       <body>
             <table>
                     <tr>
                          <td>Colombo <br> Coucou</td> 
                          <td>30</td>
                          <td>Sunny</td> 
                     </tr>
                     <tr>
                          <td>Hambantota</td> 
                          <td>33</td>
                          <td>Sunny</td> 
                     </tr>

             </table>    
       </body>
 </html> 

そして、これは私のPHPコードです:

$dom = new DOMDocument();

$html = $dom->loadHTMLFile("test.html");

$dom->preserveWhiteSpace = false; 

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


$rows = $tables->item(0)->getElementsByTagName('tr'); 


foreach ($rows as $row) 
{ 

  $cols = $row->getElementsByTagName('td'); 

  echo $cols->item(0)->nodeValue.'<br />'; 
  echo $cols->item(1)->nodeValue.'<br />'; 
  echo $cols->item(2)->nodeValue;
} 

しかし、ご覧のとおり、<br>タグがあり、それが必要ですが、PHP コードを実行すると、このタグが削除されます。
誰かがそれを維持する方法を説明できますか?

4

1 に答える 1

2

XPath を使用して表のセルの値を取得することをお勧めします。

$values = array();

$xpath = new DOMXPath($dom);

foreach($xpath->query('//tr') as $row) {
   $row_values = array();

   foreach($xpath->query('td', $row) as $cell) {
      $row_values[] = innerHTML($cell);
   }

   $values[] = $row_values;
}

<br>また、タグ自体が空のノードと見なされるため、フェッチされたコンテンツからタグが削除されるという同じ問題がありました。残念ながら、それらは自動的に改行文字 ( \n) に置き換えられません。

そこで私が行ったことは、多くのプロジェクトで非常に貴重であることが証明された独自の innerHTML 関数を設計したことです。ここで私はあなたとそれを共有します:

function innerHTML(DOMElement $element, $trim = true, $decode = true) {
   $innerHTML = '';

   foreach ($element->childNodes as $node) {
      $temp_container = new DOMDocument();
      $temp_container->appendChild($temp_container->importNode($node, true));

      $innerHTML .= ($trim ? trim($temp_container->saveHTML()) : $temp_container->saveHTML());
   }

   return ($decode ? html_entity_decode($innerHTML) : $innerHTML);
}
于 2013-02-18T14:55:48.977 に答える