ProfiPHPProfiPHP
Категория: Полезное в PHP

Удаление атрибутов HTML тегов

Удаление атрибутов атрибутов HTML тегов очень редкая задача, но когда дело доходит до ее реализации, возникают много вопросов. Решение может заключаться в использовании регулярных выражений или ручной автозаменой ненужных атрибутов. Но оба решения не являются универсальными, к тому же, очень вероятно наличие большого количества ошибок, ведь атрибуты могут быть написаны в разном порядке, наборе и количестве.

Давайте представим ситуацию. У нас имеется таблица с атрибутами Width. Данные атрибуты являются лишними, поскольку ширина определяется автоматически таблицей стилей CSS.

Универсальным и самым верным решением для удаления атрибутов является использование PHP DOMDocument. Допустим, имеется таблица:
<table>
<tr>
<td width="200px">Information</td>
<td width="100px">Information</td>
</tr>
</table>
Опишем код, который удалит все атрибуты Width:
$dom = new DOMDocument;
$dom->loadHTML( mb_convert_encoding( $content, 'HTML-ENTITIES', 'UTF-8' ) );
// Загружаем HTML из строки:
$dom->loadHTML( $content );
// Инициируем XPath:
$xpath = new DOMXPath( $dom );
// Ищем тег TD:
$tags = $xpath->query( '//td' );
// Перебираем результат и удаляем ненужный атрибут:
foreach ( $tags as $tag ) {
$tag->removeAttribute('width');
}
// сохраняем новый HTML-код в переменную для дальнейшей работы
$content = $dom->saveHTML( );
Результатом примера будет приблизительно следующее:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<body>
<table>
<tr>
<td>Information</td>
<td>Information</td>
</tr>
</table>
</body>
</html>
Как видно с результата, а теге TD удалены все лишние атрибуты Width. Аналогично можно осуществить удаление других атрибутов у всех тегах, и все это произойдет валидно и без ошибок.

А теперь опишу полностью рабочий код для удаления всех атрибутов тегов HTML.
$dom = new DOMDocument;
$dom->loadHTML( $content );
$xpath = new DOMXPath( $dom );
$tags = $xpath->query( '//table' );
foreach ( $tags as $tag ) {
$tag->removeAttribute('align');
$tag->removeAttribute('bgcolor');
$tag->removeAttribute('border');
$tag->removeAttribute('cellpadding');
$tag->removeAttribute('cellspacing');
$tag->removeAttribute('cols');
$tag->removeAttribute('rules');
$tag->removeAttribute('width');
}
$tags = $xpath->query( '//tr' );
foreach ( $tags as $tag ) {
$tag->removeAttribute('align');
$tag->removeAttribute('bgcolor');
$tag->removeAttribute('bordercolor');
$tag->removeAttribute('char');
$tag->removeAttribute('charoff');
$tag->removeAttribute('valign');
}
$tags = $xpath->query( '//td' );
foreach ( $tags as $tag ) {
$tag->removeAttribute('abbr');
$tag->removeAttribute('align');
$tag->removeAttribute('axis');
$tag->removeAttribute('background');
$tag->removeAttribute('bgcolor');
$tag->removeAttribute('bordercolor');
$tag->removeAttribute('char');
$tag->removeAttribute('charoff');
$tag->removeAttribute('headers');
$tag->removeAttribute('height');
$tag->removeAttribute('nowrap');
$tag->removeAttribute('scope');
$tag->removeAttribute('valign');
$tag->removeAttribute('width');
}
$content = $dom->saveHTML( );
При работе с DOMDocument очень часто возникают проблемы с кодировкой. Вместо кириллицы могут появится кракозябры, например:
&ETH;&#157;&ETH;&deg;&ETH;&middot;&ETH;&sup2;&ETH;&deg;
&ETH;&frac14;&ETH;&deg;&Ntilde;&#128;&Ntilde;&#136;&Ntilde;
&#128;&Ntilde;&#131;&Ntilde;&#130;&Ntilde;&#131;
Конструктор DOMDocument принимает два параметра — версию и кодировку документа:
$dom = new DOMDocument([ string $version [, string $encoding ]]);
Но документ загружается совсем не в той кодировке, что указана в конструкторе. Кодировка определяется только исходя из содержимого, загружаемого документа. Поэтому необходимо добавить к импортируемому документу строку кодировки:
$dom->loadHTML( '<meta http-equiv="Content-Type" content="text/html; charset=utf-8">'.$source );
Или сконвертировать все символы документа в HTML-entities перед импортом:
$source = mb_convert_encoding( $source, 'HTML-ENTITIES', 'utf-8' );
$dom->loadHTML( $source );

Добавить комментарий

Имя:
Текст комментария: