我有这个HTML:

<div class="body">
   <p>Some text 1</p>
   <h2>Header 2</h2>
   <p>Actual content</p>
</div>


我想从中获取除<h2>以外的所有内容,因此它看起来像这样:

<p>Some text 1</p>
<p>Actual content</p>


试图做到这一点:

$crawler = new Crawler( $html );

$body = $crawler->filter( 'div.body' );
$body->rewind();
$body = $body->current();

$h2 = $crawler->filter('h2');
$h2->rewind();
$h2 = $h2->current();

$body->removeChild($h2);


但是我得到:


[DOMException]找不到错误


我想念什么?

最佳答案

作为explained in the docs


DomCrawler组件简化了HTML和XML文档的DOM导航。


并且:


在可能的情况下,DomCrawler组件不适用于操纵DOM或重新转储HTML / XML。


DomCrawler旨在从DOM文档中提取详细信息,而不是对其进行修改。

然而...

由于PHP通过引用传递对象,并且Crawler基本上是DOMNode的包装器,因此从技术上来说,可以修改基础的DOM文档:

// will remove all h2 nodes inside .body nodes
$crawler->filter('.body h2')->each(function ($crawler) {
    foreach ($crawler as $node) {
        $node->parentNode->removeChild($node);
    }
});


这是一个工作示例:https://gist.github.com/jakzal/8dd52d3df9a49c1e5922

关于php - Symfony2 DomCrawler从DOMElement中删除节点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19177578/

10-12 01:08