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