DOM 解析器:仅删除某些属性

Posted

技术标签:

【中文标题】DOM 解析器:仅删除某些属性【英文标题】:DOM parser: remove certain attributes only 【发布时间】:2011-10-11 05:10:50 【问题描述】:

如何使用 DOM 解析器删除 span 标签中的 所有 属性,但 除了 这两个属性,

<span style="text-decoration: underline;">cultura</span>接受

<span style="text-decoration: line-through;">heart</span>接受

拒绝这个,

<span style="font-family: " lang="EN-US">May</span>接受

有可能吗?

我从另一个 post 制作的工作代码,

$content = '
<span style="text-decoration: underline;">cultura</span>l <span style="text-decoration: line-through;">heart</span>
<span style="font-family: " lang="EN-US">May</span>
';

$dom = new DOMDocument();
$dom->loadhtml($content);

foreach( $dom->getElementsByTagName( "span" ) as $span )


    foreach( $span->attributes as $attrib )
    
        $span->removeAttributeNode( $attrib );
    




$content =  $dom->saveHTML();

但是这段代码会删除span标签内的所有属性...

【问题讨论】:

您不是特别清楚:您要删除除样式属性之外的所有内容吗?还是只是文本装饰样式? 对不起。是的,除了文本装饰样式。 CSS 不在 DOM 的范围之内 - 您可以轻松删除除样式属性之外的所有属性,但您需要单独解析实际的样式定义。 【参考方案1】:

您需要手动完成。

DOM 处理 HTML 属性,而不是 CSS 属性。

您需要访问 style 属性,explode 它的值使用; 作为分隔符,然后循环数组以查找要取消设置的值。

【讨论】:

感谢您的解释 :-) 我不相信这完全正确; DOM 通过element.style 属性公开style 属性的解析版本。【参考方案2】:

这完全可以仅使用 DOM。 DOM 通过element.style 属性公开style 属性的解析版本。

$('*').each(function() 
    var s = this.style;
    for (var i = s.length - 1; i >= 0; i--)
       if (s[i] != 'font-weight')
           s.removeProperty(s[i]);
);

上面的代码删除了除font-weight之外的所有样式。

这使用 jQuery 的 $('*') 来迭代每个元素,但当然你可以只使用 DOM 来完成它。

这是一个可以玩的 JsFiddle:http://jsfiddle.net/NbN3S/

其中一个困难是名称似乎依赖于浏览器,不幸的是:例如,text-decoration 被 Firefox 分解为一堆 -moz-* 样式。

【讨论】:

以上是关于DOM 解析器:仅删除某些属性的主要内容,如果未能解决你的问题,请参考以下文章

DOM 的 JavaScript 解析器

使用 DOM 解析器根据父节点属性检索子节点值

XML DOM 解析器

Apollo 服务器 - 仅使用 Passport-JWT 将身份验证应用于某些解析器

在Javascript中使用DOM解析器获取子节点属性值

XML解析器之JAXP与DOM4J