ProfiPHPProfiPHP
  1. Главная
  2. Полезное в PHP
  3. Удаление атрибутов HTML тегов

Удаление атрибутов 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 );

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

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