【问题标题】:DOM parser: remove certain attributes onlyDOM 解析器:仅删除某些属性
【发布时间】: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 的范围之内 - 您可以轻松删除除样式属性之外的所有属性,但您需要单独解析实际的样式定义。

标签: php dom html-parsing domdocument


【解决方案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-* 样式。

【讨论】:

    猜你喜欢
    • 2018-08-18
    • 2012-02-26
    • 2013-04-20
    • 2011-11-20
    • 2015-05-19
    • 1970-01-01
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多