Удалить все атрибуты кроме (PHP)

Чтобы удалить все атрибуты у тегов на PHP, достаточно одного вызова функции string preg_replace(), но если есть необходимость какие-то атрибуты оставить, то понадобится использовать функцию string preg_replace_callback(), с проверкой на наличие разрешенных тегов, через callback-функцию и функцию preg_match_all().

html_remove_attributes

Самый лучший способ написать функцию, которая на входе, будет принимать два параметра, сам текст и массив разрешенных тегов, на выходе будет возвращен обработанный текст.

string html_remove_attributes(string $text, array $allowed = []);

$text — HTML-текст, который надо обработать;

$allowed — список разрешенных тегов.

<?php /** * @param string $text текст в котором надо удалить теги * @param array $allowed список разрешенных тегов * * @return mixed */ function html_remove_attributes($text, $allowed = []) { $attributes = implode('|', $allowed); $reg = '/(<[\w]+)([^>]*)(>)/i'; $text = preg_replace_callback( $reg, function ($matches) use ($attributes) { // Если нет разрешенных атрибутов, возвращаем пустой тег if (!$attributes) { return $matches[1] . $matches[3]; } $attr = $matches[2]; $reg = '/(' . $attributes . ')="[^"]*"/i'; preg_match_all($reg, $attr, $result); $attr = implode(' ', $result[0]); $attr = ($attr ? ' ' : '') . $attr; return $matches[1] . $attr . $matches[3]; }, $text ); return $text; }

Пример

Например у нас есть HTML-файл (test_file.html) следующего содержания:

<!DOCTYPE html> <html> <head> <title>Таблица</title> </head> <body onload="alert('html_remove_attributes (PHP)')"> <table class="my-table" style="border-collapse: collapse; border: 1px solid;" cellpadding="5" cellspacing="5"> <tr class="row" id="header"> <td style="font-weight: bold;">Идентификатор</td> <td style="font-weight: bold;">Имя</td> </tr> <tr class="row" id="row_1" style="background-color: #DDDDDD"> <td>1</td> <td>Андрей</td> </tr> <tr class="row" id="row_2" style="background-color: #FFFFFF"> <td>2</td> <td>Артем</td> </tr> <tr class="row" id="row_3" style="background-color: #DDDDDD"> <td>3</td> <td>Александр</td> </tr> <tr class="row" id="row_4" style="background-color: #FFFFFF"> <td>4</td> <td>Ева</td> </tr> <tr class="row" id="row_5" style="background-color: #DDDDDD"> <td>5</td> <td>Алексей</td> </tr> </table> </body> </html>

Удаление всех тегов кроме class

Удалим все теги из текста, кроме тега class.

<?php // Получаем текст файла $content = file_get_contents('test_file.html'); // Обрабатываем $content = html_remove_attributes($content, ['class']); // Выводим echo '<pre>'; echo htmlspecialchars($content); echo '</pre>';

Результат

В результате на экране будет выведено следующее:

<!DOCTYPE html> <html> <head> <title>Таблица</title> </head> <body> <table class="my-table"> <tr class="row"> <td>Идентификатор</td> <td>Имя</td> </tr> <tr class="row"> <td>1</td> <td>Андрей</td> </tr> <tr class="row"> <td>2</td> <td>Артем</td> </tr> <tr class="row"> <td>3</td> <td>Александр</td> </tr> <tr class="row"> <td>4</td> <td>Ева</td> </tr> <tr class="row"> <td>5</td> <td>Алексей</td> </tr> </table> </body> </html>

Если необходимо удалить все теги, вызываем следующим образом: $result = html_remove_attributes($content, []);

Категории

ПрограммированиеPHPРегулярные выражения в PHPРегулярные выражения

Читайте также

Комментарии