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

时间:2011-07-22 16:40:23

标签: php dom html-parsing domdocument

如何使用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代码中的所有属性...

2 个答案:

答案 0 :(得分:1)

您需要手动执行此操作。

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

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

答案 1 :(得分:0)

仅使用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-*样式。