Очистка HTML-тегов от атрибутов

WYSIWYG — это неотъемлемая чаcть сайтов с редактируемым контентом. Но его недостатком является «фарширование» HTML-тегов разными атрибутами. В этой статье хочю расказать о том, как можно удалить «ненужные» атрибуты в большом количестве записей.

В моём случае нужно было перенести контент с Joomla на Wordpress. Делалось это с помощью CakePHP. Контент необходимых статей Jooml-ы сохранялся как посты WP. Но таблицы нового сайта не соответствовали дизайну, потому что все имели атрибуты: border, width, cellspacing, cellpadding, align, class. Нужно было от этого всего избавится. Мне предложили два варианта:
  1. Использовать регулярные выражения
  2. Взять дамп базы и пройтись автозаменой

Оба варианта не очень подходили т.к. атрибуты прописаны в разном порядке и наборе.

В решении проблемы помог PHP DOMDocument. Вот код принципа работы:

    $dom = new DOMDocument;
    $dom->loadHTML($html); // берём необходимый HTML

    $xpath = new DOMXPath($dom); //инициируем XPath

    $tags = $xpath->query('//tag'); //ищем необходимый тег
    foreach ($tags as $tag) {
        $tag->removeAttribute('attr'); //удаляем ненужный атрибут   
    }
    
    // сохраняем новый HTML-код в переменную для дальнейшей работы
    $new = $dom->saveHTML();


Вот мой конечный код (использовался в цикле):


    $dom = new DOMDocument;
    $dom->loadHTML(mb_convert_encoding($content, 'HTML-ENTITIES', 'UTF-8'));

    $xpath = new DOMXPath($dom);
    // del attributes from <table>
    $tables = $xpath->query('//table');
    foreach ($tables as $table) {
        $table->removeAttribute('width');    
        $table->removeAttribute('cellspacing');    
        $table->removeAttribute('cellpadding');    
        $table->removeAttribute('border');
    }
    
    // del attr from <tr>
    $rows = $xpath->query('//tr');
    foreach ($rows as $row) {
        $row->removeAttribute('align');
    }
    
    $newContent = $dom->saveHTML();


Так что если нужно избавить от атрибутов в тегах постов/статтей — можно просто пройтись простеньким PHP-скриптом.
  • –14
  • 7.3k
  • 6
Share post

Comments 6

    +1
    > Мне предложили два варианта:

    Предложу третий вариант: http://htmlpurifier.org/
      +1
      В этой статье хочю расказать о том, как можно удалить «ненужные» атрибуты в большом количестве записей.

      Текст и пунктуация авторские.

      И что вы хотели сказать этой статьей?
        +4
        Краткая выжимка: Здравствуйте. В PHP есть DOMDocument. Спасибо. До свидания.
          0
          Надо было использовать заготовку.
          Доброе время суток, просьба не пинать, это моя первая статья, подробности под катом. В PHP есть DOMDocument. Спасибо за внимание, если есть ошибки — в ПМ, если есть вопросы — в комментарии, если интересно — продолжу тему позже.
            0
            Тем не менее, это знание может оказаться очень полезным для тех, кто не пишет профессионально на PHP, но нуждается в несложных скриптах для обработки HTML. Люди пытаются использовать регекспы и sed для парсинга там, где достаточно PHP-скрипта из пяти строчек.
              +2
              любое знание будет полезным. Но не любому должна быть посвящена статья на хабре.

        Only users with full accounts can post comments. Log in, please.