2013-04-30 67 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作为字符串