2011-07-22 30 views
2

如何使用DOM解析器来去除在span标签的所有属性,但除了这两个属性,DOM解析器:删除某些属性只

<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标签内的所有属性...

+0

你不是特别清楚:要删除除了样式属性的一切吗?或只是文字装饰风格? –

+0

对不起。是的,除了文字装饰风格之外。 – laukok

+0

CSS不在DOM的范围之内 - 您可以轻松地除去所有样式属性,但是您需要单独解析实际的样式定义。 –

回答

1

你需要做手工。

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

您需要访问风格属性,explode它使用;作为分隔符值,然后循环数组找你想取消设置值。

+0

谢谢您对此的解释:-) – laukok

+0

我不相信这是完全正确的; DOM通过['element.style'](https://developer.mozilla.org/en/DOM/element.style)属性公开了'style'属性的解析版本。 –

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被拆开火狐成一束的-moz-*风格。