PHP DOMDocument:按类删除元素

4
我想删除所有具有特定类的节点。
为了找到这些元素,我使用以下代码:
$xpath = new DOMXPath($dom);
    foreach( $xpath->query('//div[contains(attribute::class, "foo")]') as $e ) {
        // Delete this node
    }

但是如何在这个foreach循环中删除元素?

编辑: 顺便问一下: 在开始循环之前,如何首先检查DOM中是否存在具有"class = foo"的元素?

更新:

这是我的HTML:

<div class="main">
    <div class="delete_this" contenteditable="true">Target</div>
    <div class="class1"></div>
    <div class="content"><p>Anything</p></div>
</div>

这对以上示例无效:

$xpath = new DOMXPath($dom);
foreach( $xpath->query('//div[contains(attribute::class, "delete_this")]') as $e ) {
    $e->parentNode->removeChild($e);
}
3个回答

14
您需要使用父元素的removeChild()方法:
$xpath = new DOMXPath($dom);
foreach($xpath->query('//div[contains(attribute::class, "foo")]') as $e ) {
    // Delete this node
    $e->parentNode->removeChild($e);
}

顺便提一下,关于你的第二个问题,如果没有找到元素,循环根本不会迭代。


这里有一个可行的例子:

$html = <<<EOF
<div class="main">
    <div class="delete_this" contenteditable="true">Target</div>
    <div class="class1"></div>
    <div class="content"><p>Anything</p></div>
</div>
EOF;

$doc = new DOMDocument();
$doc->loadHTML($html);

$selector = new DOMXPath($doc);
foreach($selector->query('//div[contains(attribute::class, "delete_this")]') as $e ) {
    $e->parentNode->removeChild($e);
}

echo $doc->saveHTML($doc->documentElement);

谢谢。我忘记了saveHTML :-( - user3142695
不客气。顺便说一下,在这个例子中,你可以只使用以下查询://div[@class = "delete_this"] - hek2mgl
谢谢,伙计。正是我所需要的。 - Juergen Schulze

2
对于第二个问题,查询结果有一个length属性,您可以使用它来查看是否有匹配项:
$xpath = new DOMXPath($doc);
$nodes = $xpath->query('//div[contains(attribute::class, "foo")]');

printf('Removing %d nodes', $nodes->length);

1

这将删除所有具有该类的 div。 要实际删除所有具有该类的元素,请使用 *:

$selector = new \DOMXPath( $doc );
foreach ( $selector->query( '//*[contains(attribute::class, "' . $class . '")]' ) as $e ) {
  $e->parentNode->removeChild( $e );
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接