使用 DOMDocument,是不是可以获取某个 DOM 中存在的所有元素?

Posted

技术标签:

【中文标题】使用 DOMDocument,是不是可以获取某个 DOM 中存在的所有元素?【英文标题】:Using DOMDocument, is it possible to get all elements that exists within a certain DOM?使用 DOMDocument,是否可以获取某个 DOM 中存在的所有元素? 【发布时间】:2014-06-09 17:57:30 【问题描述】:

假设我有一个包含许多不同元素的 html 文件,每个元素都有不同的属性。假设我事先不知道这个 HTML 会是什么样子。

使用 php 的 DOMDocument,我如何遍历 ALL 元素并修改它们?我看到的只是 getElementByTagName 和 getElementById 等。我想遍历所有元素。

例如。假设HTML看起来像这样(只是一个例子,实际上我不知道结构):

$html = '<div class="potato"><span></span></div>';

我希望能够进行一些简单的 DOM 修改(比如在 javascript 中):

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

// Obviously the code below doesn't work but showcases what I want to achieve
foreach($dom->getAllElements as $element )
    if(!$element->hasClass('potato'))
       $element->addClass('potato');
     else
       $element->removeClass('potato');
    

$html = $dom->SaveHTML();

所以在这种情况下,我希望生成的 html 看起来像这样:

    $html = '<div><span class="potato"></span></div>';

那么我怎样才能遍历所有元素并在 foreach 循环中动态进行修改呢?我真的不想为此使用正则表达式。

【问题讨论】:

您想在每个元素中添加/反转class="potato"?... 请注意 hasClass 在 PHP 的 DOMNode 接口中不可用,因此您可能希望使用允许 CSS 选择器的东西,例如 Simple HTML DOM 【参考方案1】:

您可以将星号 * 与返回所有元素的 getElementsByTagName() 一起传递:

foreach($dom->getElementsByTagName('*') as $element )


来自Manual:

姓名 要匹配的标记的本地名称(没有命名空间)。特殊值 * 匹配所有标签。

【讨论】:

如何使用 HTML 标签写入新文件?

以上是关于使用 DOMDocument,是不是可以获取某个 DOM 中存在的所有元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PHP DomDocument 获取规范值?

在 PHP 中从 DOMNode 创建 DOMDocument

如何使用 PHP 的 DOMDocument 获取元素的序列化 HTML?

PHP DOMDocument - 获取 BODY 的 html 源代码

DOMDocument 节点获取 HTML 内容

DOMDocument无法解析XML