DOM parser: удалить только определенные атрибуты - PullRequest
2 голосов
/ 22 июля 2011

Как использовать синтаксический анализатор DOM для удаления всех атрибутов в тегах span, но кроме этих двух атрибутов,

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

<span style="text-decoration: line-through;">heart</span> принять

отклонить это,

<span style="font-family: " lang="EN-US">May</span> принять

Возможно ли это?

Мой рабочий код из другого сообщения Я сделал,

$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 ]

1 голос
/ 22 июля 2011

Вам нужно сделать это вручную.

DOM обрабатывает атрибуты HTML, а не свойства CSS.

Вам необходимо получить доступ к атрибуту style , explode к его значению, используя ; в качестве разделителя, а затем зациклить массив, чтобы найти значение, которое вы хотите сбросить.

0 голосов
/ 21 октября 2011

Это возможно только с DOM. DOM предоставляет разобранную версию атрибута style через свойство element.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/

Одна из сложностей в этом заключается в том, что имена, к сожалению, зависят от браузера: например, Firefox разбивает text-decoration на кучу -moz-* стилей.

...