0

我有一个 HTML 文档(字符串),其中包含一个带有“foo”类的 div:

<html>
<head>
  ...
</head>
<body>
<div class="whatever">Blabla</div>
<div>
   <span>Text</span>
</div>
<table>
   <tr><td><div class="foo">GARBAGE</div></td></tr>
</table>
</body>

我只想删除所有具有“foo”类的 div,这就是我到目前为止所拥有的:

$doc = new DOMDocument();
$doc->loadHTML($myhtml);
$xpath = new DOMXpath($doc);
$all = $xpath->query("/html");

$result = remove_elements_with_class('foo', $all);

功能如何remove_elements_with_class

4

1 回答 1

4

后:

$xpath = new DOMXpath($doc);

你需要:

  1. 选择要删除的所有节点
  2. 调用DOMNode::removeChild()这些节点

因此,要完成第一个任务,您可以发出一个 XPath 查询来查找<div>类为 的所有节点foo。该查询如下所示:

//div[contains(concat(' ', @class, ' '), ' foo ')]

请注意,这处理了元素可以具有多个类的情况,即foo bar bazbaz foo bar。如果这是不可取的,并且您只想完全匹配类(所以现在只有一个完全foo匹配的类),查询变为:

//div[@class = 'foo']

而且,在 PHP 中,这变成:

$nodes = $xpath->query( "//div[contains(concat(' ', @class, ' '), ' foo ')]");

从这里开始,您拥有要在 中删除的所有节点$nodes,因此只需遍历它们,然后通过抓取<div>的父节点并删除其子节点来将它们从文档中删除:

foreach( $nodes as $node) {
    $node->parentNode->removeChild( $node);
}

仅此而已!您可以在此演示中看到它的工作原理。

编辑:要保留<div>并删除内容,请将节点的nodeValue属性设置为空字符串:

foreach( $nodes as $node) {
    $node->nodeValue = '';
}

您可以在这个更新的演示中看到它的工作原理。您也可以将 替换<div>为新创建的<div>,因为这种方法似乎更防弹,但这应该适用于您的用例。

于 2012-10-15T20:38:51.873 回答