1

我正在使用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.'>';
    }
}

但在我看来,这似乎更荒谬......

4

1 回答 1

1

导出 HTML 时,您必须有一个根元素。在大多数情况下,最有用的是body. 由于您正在加载 HTML 片段,因此您肯定知道它不会有任何属性,因此substr(...,6,-7)完全可以预测并且很好。

于 2013-05-30T16:00:40.410 回答