Как убрать HTML-теги из строки в PHP
Эффективные способы удаления HTML-тегов в PHP
Основное решение: strip_tags()
Функция strip_tags() удаляет все HTML-теги из строки, оставляя только текст. Это наиболее быстрый и безопасный способ очистки строк от разметки перед выводом или сохранением.
$html = '<p>Привет <b>мир</b></p>';
$text = strip_tags($html);
echo $text; // Привет мирPhp только цифры (оставить только цифры в php)
Привет мир
Php text get (получение текста в php)
Функция принимает второй необязательный параметр - строку с перечислением тегов, которые нужно сохранить.
$html = '<p>Текст <a href="#">ссылка</a> <img src="pic.jpg"></p>';
$text = strip_tags($html, '<a><img>');
echo $text; // Текст <a href="#">ссылка</a> <img src="pic.jpg">подстрока строки php (поиск подстроки в строке php)
Текст <a href="#">ссылка</a> <img src="pic.jpg">
Php строки в файле (строки в файле php)
Возможные проблемы:
- strip_tags() не проверяет корректность HTML. Некорректная вложенность может привести к потере части текста.
- Функция не удаляет атрибуты у сохранённых тегов - для этого нужно дополнительно очищать через регулярные выражения или DOM.
- При работе с пользовательским вводом strip_tags() не защищает от XSS, если разрешены опасные теги (например, <script>).
Как избавиться от HTML-тегов с экранированием вместо удаления?
htmlspecialchars() преобразует специальные символы в HTML-сущности, не удаляя теги, а делая их видимыми как текст. Подходит для вывода данных в HTML-контексте.
$input = '<script>alert("xss")</script>';
echo htmlspecialchars($input); // <script>alert("xss")</script>Php preg match (функция preg_match в php)
<script>alert("xss")</script>убрать теги php (удаление html-тегов в php)
Ошибки и решения:
- Если не указать кодировку (третий параметр), могут быть проблемы с многобайтовыми символами. Рекомендуется указывать 'UTF-8'.
- htmlspecialchars() не удаляет теги, поэтому если нужно именно удалить, используйте strip_tags().
Как удалить теги, если strip_tags() не справляется с некорректным HTML?
Используйте регулярные выражения с функцией preg_replace(). Однако этот метод менее надёжен и может давать ложные срабатывания.
$html = 'Текст <b>жирный</b> <img src=pic.jpg>';
$text = preg_replace('/<[^>]*>/', '', $html);
echo $text; // Текст жирный Php убрать из строки (удаление подстроки в php)
Текст жирный
Проблемы регулярных выражений:
- Выражение <[^>]*> не обрабатывает закрывающие теги с переносом строки или кавычками внутри.
- Оно может удалить содержимое тегов-комментариев (<!-- ... -->).
- Не подходит для сложного HTML с вложенными тегами.
Как удалить теги, но оставить безопасные элементы и атрибуты?
Примените класс DOMDocument для разбора HTML и удаления нежелательных узлов. Это даёт полный контроль.
$html = '<p>Текст <a href="evil" onclick="alert()">ссылка</a></p>';
$dom = new DOMDocument();
@$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($dom);
foreach ($xpath->query('//@*') as $attr) {
if ($attr->name === 'href' || $attr->name === 'src') continue;
$attr->parentNode->removeAttribute($attr->name);
}
echo $dom->saveHTML(); // <p>Текст <a href="evil">ссылка</a></p>
<p>Текст <a href="evil">ссылка</a></p>
Типичные ошибки:
- Без подавления ошибок (@) loadHTML может выдавать предупреждения при некорректном HTML.
- При использовании LIBXML_HTML_NOIMPLIED могут возникнуть проблемы с фрагментами.
- Необходимо помнить о кодировке: если HTML без meta, DOMDocument может неправильно интерпретировать символы.
Как удалить теги с помощью фильтров PHP?
Функция filter_var() с константой FILTER_SANITIZE_STRING удаляет теги и специальные символы, но этот фильтр устарел и не рекомендуется к использованию.
$html = '<b>пример</b>';
echo filter_var($html, FILTER_SANITIZE_STRING); // пример
пример
Недостатки:
- Фильтр удаляет не только теги, но и экранирует кавычки, что может исказить данные.
- Начиная с PHP 8.1 данный фильтр помечен как устаревший (DEPRECATED).
Общие замечания по безопасности
Для вывода пользовательского контента всегда используйте htmlspecialchars(). Если необходимо оставить ограниченный набор тегов, применяйте библиотеки вроде HTMLPurifier или собственный парсер на основе DOMDocument.
Расширенные примеры удаления HTML-тегов
Пример 1. Удаление всех тегов, но сохранение текстового содержимого с помощью strip_tags()
$html = '<div><h1>Заголовок</h1><p>Текст с <b>разметкой</b></p></div>';
$clean = strip_tags($html);
echo $clean;
Заголовок Текст с разметкой
Все теги удалены, текст объединён. Пробелы и переводы строк сохраняются.
Пример 2. Сохранение нескольких тегов и удаление атрибутов через DOMDocument
$html = '<p>Пример <a href="http://example.com" target="_blank">ссылка</a> и <img src="img.png" alt="картинка" style="border:1px"></p>';
$dom = new DOMDocument();
@$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED);
$xpath = new DOMXPath($dom);
$allowedAttrs = ['href', 'src', 'alt'];
foreach ($xpath->query('//@*') as $attr) {
if (!in_array($attr->name, $allowedAttrs)) {
$attr->parentNode->removeAttribute($attr->name);
}
}
echo $dom->saveHTML();
<p>Пример <a href="http://example.com">ссылка</a> и <img src="img.png" alt="картинка"></p>
Атрибуты target и style удалены, а разрешённые href, src, alt остались.
Пример 3. Использование регулярного выражения для удаления тегов вместе с содержимым (если нужно вырезать определённые теги полностью)
$html = 'Привет <script>alert("bad")</script> мир';
$cleaned = preg_replace('/<script[^>]*>.*?<\/script>/si', '', $html);
echo $cleaned;
Привет мир
Модификатор s позволяет точке захватывать переносы строк, i - игнорировать регистр. Регулярное выражение опасно при вложенных тегах или комментариях.
Пример 4. Преобразование всего HTML в текст с помощью html_entity_decode() после strip_tags()
$html = '<b>текст</b>';
$step1 = strip_tags($html); // <b>текст</b> - теги уже экранированы
$step2 = html_entity_decode($step1); // <b>текст</b>
echo $step2;
<b>текст</b>
Этот подход нужен, если в строке уже были HTML-сущности, и после удаления тегов их нужно преобразовать в реальные символы.
Пример 5. Безопасное удаление всех тегов, кроме указанных, с помощью HTMLPurifier (сторонняя библиотека)
require_once 'HTMLPurifier.auto.php';
$config = HTMLPurifier_Config::createDefault();
$config->set('HTML.Allowed', 'p,b,a[href]');
$purifier = new HTMLPurifier($config);
$html = '<p>Привет <script>xss()</script> <b>мир</b></p>';
$clean = $purifier->purify($html);
echo $clean;
<p>Привет <b>мир</b></p>
HTMLPurifier удаляет скрипты и оставляет только разрешённые теги и атрибуты. Библиотека защищает от XSS и нормализует код.