我正在使用DOMDocument
该类来解析一个相当不可预测的标记字符串。它的格式不是很好,我需要一些数据。当然,正则表达式是正确的。
到目前为止,我有这个:
$dom = new DOMDocument;
$dom->loadHTML($str);
$contents = $dom->getElementsByTagName('body')->item(0);
echo $dom->saveXML($contents);
现在这给了我:
<body>
<p>What I'm really after</p>
<ul><li>Foo</li><li>Bar</li></ul>
<h6>And so on</h6>
</body>
真正让我烦恼的是那些<body>
标签。我要他们走。浏览网络后,我偶然发现了最奇怪的解决方法。有些比其他的更hacky,所以最后,我选择了:
echo substr($dom->saveXML($contents), 6, -7);
对我来说仍然感觉很糟糕,但这是我能找到的最好的。有没有更可靠的方法来获取 DOM 的 innerHTML,从给定的节点开始,而不实际显示相应的标签?
我已经看到使用正则表达式的建议(恕我直言),甚至循环遍历所有子节点,呼应那些拥有自己的 childNodes 的孩子,并将那些没有的孩子串在一起:
if ($contents->hasChildNodes())
{
$children = $contents->getElementsByTagName('*');
foreach($children as $child)
{
if ($child->hasChildNodes() || $child->nodeName === 'br')
{//or isset($standaloneNodes[$child->nodeName])
echo $dom->saveXML($child);
continue;
}
echo '<'.$child->nodeName.'>'.$child->nodeValue.'</'.$child->nodeName.'>';
}
}
但在我看来,这似乎更荒谬......