开发者

DOM parser: remove certain attributes only

How can I use DOM parser to remove all attributes in span tags but except these two attributes,

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

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

reject this,

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

Is it possible?

My working code from the other post I made,

$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&开发者_高级运维lt;/span>
';

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

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

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


}

$content =  $dom->saveHTML();

But this code will remove all attributes inside the span tags...


You need to do it manually.

DOM handles HTML attributes, not CSS properties.

You need to access the style attribute, explode it's value using ; as a delimiter, then loop the array looking for the value you want to unset.


This is entirely possible with DOM only. DOM exposes a parsed version of the style attribute through the element.style property.

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

The above code removes every style except font-weight.

This uses jQuery's $('*') to iterate over every element, but of course you can do it the hard way using just DOM.

Here's a JsFiddle to play with: http://jsfiddle.net/NbN3S/

One difficulty with this is that the names appear to be browser-dependent, unfortunately: for example, text-decoration is taken apart by Firefox into a bunch of -moz-* styles.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜