2012-05-25 160 views
0

我想使用dom文档提取特定的HTML块。Dom文档 - 提取文档ID&保存

我的代码如下:

$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重新加载到对象中。

这可以做得更优雅或更快?

谢谢!

回答

1

我假设你想变异现有$domd文件,以你从这些内容节点抓住那些子节点完全替换:

UPDATE:刚刚意识到,由于您使用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 
+0

辉煌!完善!非常感谢,这正是我所期待的。 – whizzkid