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-скриптом.

Комментарии (6)