2013-02-18 181 views
1

我有一个小问题。
我想用PHP解析一个简单的HTML文档。 下面是简单的HTML:在解析HTML文本内容时保留<br>标签

<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代码运行时,它会删除这个标签。
任何人都可以解释我如何保持它?

回答

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); 
} 
+0

首先感谢您的关注和您的代码。我有一个错误的代码: “可捕捉致命错误:传递给innerHTML() $ dom = new DOMDocument(); \t \t \t $ dom-> loadHTMLFile(“test.html”); \t \t \t \t \t $ values = array(); \t \t \t $ xpath = new DOMXPath($ dom); \t \t \t的foreach($ xpath->查询( '// TR')为$行){ \t \t \t $ row_values =阵列(); \t \t \t的foreach($ xpath->查询( '// TR')为$细胞){ \t \t \t $ row_values [] = innerHTML的($细胞>的nodeValue); \t \t \t \t \t \t} \t \t \t $值[] = $ row_values; \t \t \t}' – 2013-02-18 15:22:30

+0

对代码进行了更正,内部查询出错了,对不起=) – silkfire 2013-02-18 15:25:31

+0

对不起,我对此不太满意,但是我仍然有这个错误。 :( – 2013-02-18 15:35:11