0

我正在尝试使用 dom 文档提取特定的 HTML 块。

我的代码如下:

    $domd = new DOMDocument('1.0', 'utf-8');
    $domd->loadHTML($string);
    $this->hook = 'content';
    if($this->hook !== '') {
        $main = $domd->getElementById($this->hook);
        $newstr = "";
        foreach($main->childNodes as $node) {
            $newstr .= $domd->saveXML($node, LIBXML_NOEMPTYTAG);
        }
        $domd->loadHTML($newstr);
    }
    //MORE PARSING USING THE DOMD OBJECT

它工作得很好,但是 foreach 很慢,我想知道是否有更智能的方法来做到这一点。我正在将 HTML 重新加载到 $domd 中,以便继续编辑。在我的脑海里,我觉得我应该保存一个片段,而不是将保存的 $newstr 重新加载到对象中。

这可以变得更优雅或更快吗?

谢谢!

4

1 回答 1

1

我假设您想改变现有$domd文档,将其完全替换为您从该内容节点获取的那些子节点:

更新:刚刚意识到,由于您使用 重新加载loadHTML,您可能希望保留它创建的html/节点。body下面的代码已被调整为空body并在此处附加片段:

$domd = new DOMDocument('1.0', 'utf-8');
$domd->loadHTML($string);
$this->hook = 'content';
if($this->hook !== '') {
    $main = $domd->getElementById($this->hook);
    $fragment = $domd->createDocumentFragment();
    while($main->hasChildNodes()) {
        $fragment->appendChild($main->firstChild);
    }
    $body = $domd->getElementsByTagName("body")->item(0);
    while($body->hasChildNodes()) {
        $body->removeChild($body->firstChild);
    }
    $body->appendChild($fragment);
}
//MORE PARSING USING THE DOMD OBJECT
于 2012-05-25T01:43:25.913 回答