2013-04-30 71 views
2

我有一個數據庫表,它包含以下一列數據格式。在php中解析HTML表格

<table cellspacing="1" cellpadding="0" border="0" width="395"> 
    <tbody> 
     <tr> 
      <td valign="top" width="135"> 
       <p>Calories (kcal)<br>Energy (kj)<br>Fats<br>Carbohydrates<br>Protein<br></p> 
      </td> 
      <td valign="top"> 
       <p>178<br>748<br>0 g<br>9.6 g<br>0.1 g<br></p> 
      </td> 
      <td valign="top" width="135"> 
       <p>Fiber<br>Sugars<br>Cholesterol<br>Sodium<br>Alcohol<br></p> 
      </td> 
      <td valign="top"> 
       <p>0 g<br>-<br>0 mg<br>-<br>26.2 g<br></p> 
      </td> 
     </tr> 
    </tbody> 
</table> 

我要讓這對於CaloriesFatsCarbohydratesProtein單獨的列另一個數據庫。 要分離這些數據,我需要從舊數據庫中提取數據並像這樣解析它。

$qry = "SELECT * FROM table"; 
$res = $mysqli->query($qry); 

// new dom object 
$dom = new DOMDocument(); 

while ($row = $res->fetch_assoc()) { 

    $html = @$dom->loadHTML($row['columndata']); 
    //the table by its tag name 
    $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 />'; 
    } 
} 

此輸出以下:

Calories (kcal)Energy (kj)FatsCarbohydratesProtein 
1787480 g9.6 g0.1 g 

我無法單獨輸出字符串中有新的數據庫中正確列值。

例如,我想有值178Calories列,在Fats0 g

+0

你是什麼意思「解析基於HTML標籤的數據」? – Preetam 2013-04-30 08:31:04

+0

你想要什麼輸出? – Waygood 2013-04-30 08:32:31

+0

'nodeValue'刪除所有的標籤,你想要的東西像Javascript的'innerHTML'。 DOMDocument API沒有這個,你需要編寫它。在http://php.net/manual/en/class.domelement.php – Barmar 2013-04-30 08:36:51

回答

2

嘗試遍歷P元素的子節點:

foreach ($rows as $row) 
{ 
    $paragraphs = $row->getElementsByTagName('p'); 
    //ensure that all the text between <br> is in one text node 
    $paragraphs->item(0)->normalize(); 
    foreach($paragraphs->item(0)->childNodes as $node) { 
     if ($node->nodeType == XML_TEXT_NODE) { 
      echo $node->nodeValue . '<br/>; 
     } 
    } 

} 

調用正常化()的p元素,以確保br元素之間的文本是在每一個文本節點是非常重要的,並且不分開,例如<p>Calories (kcal)<br>Energy (kj)<br>...</p>將具有文本節點Calories (kcal)Energy (kj),而不是Cal,ories (kcal)等等,它們可能沒有正常化。

+1

感謝@SWilk的幫助我能夠完成這一點。 – Noor 2013-04-30 11:36:21

2

如果你希望得到您的TD元素的innerHTML,你可以使用下面的結構:

$tdElement = $row->getElementsByTagName('td')->item(0); 
$tdElement->ownerDocument->saveHTML($tdElement); 

它應該返回您節點的內部HTML作爲字符串