WYSIWYG — это неотъемлемая чаcть сайтов с редактируемым контентом. Но его недостатком является «фарширование» HTML-тегов разными атрибутами. В этой статье хочю расказать о том, как можно удалить «ненужные» атрибуты в большом количестве записей.
В моём случае нужно было перенести контент с Joomla на Wordpress. Делалось это с помощью CakePHP. Контент необходимых статей Jooml-ы сохранялся как посты WP. Но таблицы нового сайта не соответствовали дизайну, потому что все имели атрибуты: border, width, cellspacing, cellpadding, align, class. Нужно было от этого всего избавится. Мне предложили два варианта:
Оба варианта не очень подходили т.к. атрибуты прописаны в разном порядке и наборе.
В решении проблемы помог PHP DOMDocument. Вот код принципа работы:
Вот мой конечный код (использовался в цикле):
Так что если нужно избавить от атрибутов в тегах постов/статтей — можно просто пройтись простеньким PHP-скриптом.
В моём случае нужно было перенести контент с Joomla на Wordpress. Делалось это с помощью CakePHP. Контент необходимых статей Jooml-ы сохранялся как посты WP. Но таблицы нового сайта не соответствовали дизайну, потому что все имели атрибуты: border, width, cellspacing, cellpadding, align, class. Нужно было от этого всего избавится. Мне предложили два варианта:
- Использовать регулярные выражения
- Взять дамп базы и пройтись автозаменой
Оба варианта не очень подходили т.к. атрибуты прописаны в разном порядке и наборе.
В решении проблемы помог 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-скриптом.