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.
精彩评论