использование PHP регулярных выражений для удаления атрибутов из элементов HTML-тегов

0

Хотелось бы удалить любой атрибут в тегах html, и я думаю, что это может быть достигнуто с помощью regex, но я не очень хорошо использую регулярное выражение.

Пробовал работать с str_replace, но это просто не правильный путь. И я искал вопросы, подобные этому, но не смог найти.

Пример:

Получил html-теги, подобные этому в переменной:

$str = '
<p class="class_style" style="font-size: medium; line-height: normal; letter-spacing: normal;">content</p>
<span class="another_class_style" style="font-size: medium; line-height: normal; letter-spacing: normal;">content</span>
<ul class="another_class_style" style="background:#006;"></ul>
<li class="another_class_style" style=" list-style:circle; color:#930;">content</li>';

Позвоните в определенный файл preg_match()

$new_str = preg_match('', $str)

Ожидаемый результат:

$new_str = '
<p>content</p>
<span>content</span>
<ul></ul>
<li>content</li>';

Заметьте, что я не собираюсь снимать html-теги, а мне просто нужно удалить тег-элементы в тегах.

php strip_tags() isn't an option

Был бы благодарен за помощь в этом.

Теги:

3 ответа

0
Лучший ответ
$str = '
<p class="class_style" style="font-size: medium; line-height: normal; letter-spacing: normal;">content</p>
<span class="another_class_style" style="font-size: medium; line-height: normal; letter-spacing: normal;">content</span>
<ul class="another_class_style" style="background:#006;"></ul>
<li class="another_class_style" style=" list-style:circle; color:#930;">content</li>';

$clean = preg_replace('/ .*".*"/', '', $str);

echo $clean;

Вернется:

<p>content</p>
<span>content</span>
<ul></ul>
<li>content</li>

Но, пожалуйста, не используйте регулярное выражение для анализа HTML, используйте парсер DOM.

  • 0
    Работает отлично! Tnx ..
1

Хотя регулярное выражение может выполнять эту задачу, обычно рекомендуется использовать функции DOM для фильтрации или других манипуляций с HTML. Вот многоразовый класс, который использует метод DOM для удаления нежелательных свойств. Вы просто задаете те HTML-теги и свойства, которые хотите, и отфильтровываете нежелательные фрагменты HTML.

class allow_some_html_tags {
    var $doc = null;
    var $xpath = null;
    var $allowed_tags = "";
    var $allowed_properties = array();

    function loadHTML( $html ) {
        $this->doc = new DOMDocument();
        $html = strip_tags( $html, $this->allowed_tags );
        @$this->doc->loadHTML( $html );
        $this->xpath = new DOMXPath( $this->doc );
    }
    function setAllowed( $tags = array(), $properties = array() ) {
        foreach( $tags as $allow ) $this->allowed_tags .= "<{$allow}>";
        foreach( $properties as $allow ) $this->allowed_properties[$allow] = 1;
    }
    function getAttributes( $tag ) {
        $r = array();
        for( $i = 0; $i < $tag->attributes->length; $i++ )
            $r[] = $tag->attributes->item($i)->name;
        return( $r );
    }
    function getCleanHTML() {
        $tags = $this->xpath->query("//*");
        foreach( $tags as $tag ) {
            $a = $this->getAttributes( $tag );
            foreach( $a as $attribute ) {
                if( !isset( $this->allowed_properties[$attribute] ) )
                    $tag->removeAttribute( $attribute );
            }
        }
        return( strip_tags( $this->doc->saveHTML(), $this->allowed_tags ) );
    }
}

Класс дважды использует strip_tags - один раз, чтобы быстро устранить нежелательные теги, а затем после удаления свойств из остатка он исключает дополнительные теги, вставленные функциями DOM (doctype, html, body). Чтобы использовать, просто выполните следующее:

$comments = new allow_some_html_tags();
$comments->setAllowed( array( "p", "span", "ul", "li" ), array("tabindex") );
$comments->loadHTML( $str );
$clean = $comments->getCleanHTML();

Функция setAllowed принимает два массива - набор допустимых тегов и набор разрешенных свойств (если позже вы решите, что хотите сохранить некоторые из них). Я изменил вашу строку ввода, чтобы добавить добавленное свойство tabindex = "1" где-нибудь, чтобы проиллюстрировать фильтрация. Вывод $ clean:

<p>content</p>
<span>content</span>
<ul tabindex="3"></ul><li>content</li>
0

Самый простой способ удаления html-тегов в php - strip_tags()

Или вы можете удалить

preg_replace("/<.*?>/", "", $str);
  • 0
    ОП ищет способ удалить атрибуты, а не сами теги

Ещё вопросы

Сообщество Overcoder
Наверх
Меню