2013-02-18 67 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