我有一个数据库表,其中一列包含以下格式的数据。
<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>
我想创建另一个数据库,其中包含卡路里
、脂肪
、碳水化合物
和蛋白质
的单独列。
为了分离这些数据,我需要从旧数据库中获取数据并像这样解析它。
$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
我无法分离输出字符串以在新数据库中获得正确的列值。
例如,我希望在卡路里
列中具有值178
,在脂肪
中具有0 g
栏目等
最佳答案
尝试迭代 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
上调用normalize()非常重要元素,确保 br
之间的文本每个元素都在一个文本节点中,并且不分隔,例如 <p>Calories (kcal)<br>Energy (kj)<br>...</p>
将具有 Calories (kcal)
的文本节点和Energy (kj)
,不是Cal
, ories (
, kcal)
等等,它们可能没有标准化。
关于php - 在php中解析HTML表格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16295379/