
PHP предоставляет несколько инструментов для очистки строк. Среди них встроенные функции strip_tags() и htmlspecialchars(), использование регулярных выражений, а также готовые библиотеки для более гибкой фильтрации. Каждый способ имеет свои преимущества и ограничения: от простого удаления всех тегов до выборочной фильтрации допустимых элементов.
В этой статье будут рассмотрены практические примеры удаления тегов, нюансы работы с кириллическим текстом и ситуация, когда полное удаление HTML не подходит. Такой разбор позволит выбрать подходящий метод для конкретной задачи: очистка пользовательского ввода, подготовка текста для базы данных или генерация безопасного контента.
Удаление тегов с помощью strip_tags()
Функция strip_tags() в PHP предназначена для удаления HTML и PHP тегов из строки. Она принимает строку и опциональный список допустимых тегов, которые сохраняются без изменений.
Пример базового использования:
$text = "<p>Привет, <b>мир</b>!</p>";
echo strip_tags($text); // Результат: Привет, мир!
Сохранение определённых тегов:
$text = "<p>Текст с <a href='#'>ссылкой</a></p>";
echo strip_tags($text, "<a>");
// Результат: Текст с <a href='#'>ссылкой</a>
Основные особенности:
| Аргумент | Описание |
|---|---|
string $str |
Исходная строка с HTML/PHP кодом |
string $allowable_tags |
Список тегов, которые не будут удалены (например, «<b><i>») |
Рекомендации: использовать strip_tags() только для простой фильтрации отображаемого текста. Для защиты от XSS применять дополнительно htmlspecialchars().
Ограничение допустимых тегов при очистке строки

Иногда необходимо не полностью удалить HTML, а оставить часть тегов, которые обеспечивают базовое форматирование текста. Для этого в PHP можно использовать функцию strip_tags() с указанием допустимых элементов.
Пример:
$text = "<p>Привет, <b>мир</b>!</p><script>alert(1)</script>";
$clean = strip_tags($text, "<p><b>");
echo $clean;
// Результат: <p>Привет, <b>мир</b>!</p>
Рекомендации при использовании:
- Разрешайте только те теги, которые реально нужны (например,
<b>,<i>,<ul>,<li>). - Не добавляйте сложные элементы (
<script>,<iframe>,<object>), так как они создают уязвимости. - Комбинируйте
strip_tags()сhtmlspecialchars(), если требуется дополнительно закодировать опасные символы.
В случаях, когда нужен более строгий контроль, стоит использовать специализированные библиотеки (например, HTML Purifier), которые позволяют настроить белый список тегов и атрибутов.
Применение регулярных выражений для удаления тегов

Регулярные выражения позволяют удалить HTML-теги, используя функцию preg_replace(). Базовый вариант:
$clean = preg_replace('/<[^>]+>/', '', $html);
Выражение /<[^>]+>/ находит любую подстроку, заключённую в угловые скобки. Однако оно удаляет все элементы без разбора, включая скрипты и стили. Чтобы исключить риск сохранения содержимого опасных тегов, рекомендуется использовать расширенный паттерн:
$clean = preg_replace('/<(script|style)[^>]*>.*?<\/\1>/si', '', $html);
После этого можно удалить оставшиеся теги общим выражением. Такой подход предотвращает сохранение JavaScript и CSS-кода.
Для обработки многострочных блоков всегда используйте модификатор s, позволяющий точке совпадать с символом новой строки. Для нечувствительности к регистру тегов используйте модификатор i.
Регулярные выражения подходят для задач, где требуется простая очистка текста от тегов, но при сложной HTML-структуре лучше комбинировать их с парсерами, чтобы избежать некорректного удаления содержимого.
Очистка содержимого с использованием DOMDocument

DOMDocument позволяет разобрать HTML как дерево и работать с каждым узлом напрямую. Такой подход надёжнее регулярных выражений, так как исключает удаление нужных символов или нарушение структуры.
Пример:
$html = "<div>Текст <b>с тегами</b></div>";
$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML('' . $html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
libxml_clear_errors();
echo $dom->textContent; // Результат: "Текст с тегами"
Ключевой момент – использование textContent, которое возвращает только текстовое содержимое без тегов. Для корректной работы с UTF-8 добавляется декларация <?xml encoding="UTF-8"?>.
Если необходимо оставить часть тегов, можно обойти дерево через $dom->getElementsByTagName() и удалить только определённые узлы.
Удаление тегов через встроенные функции фильтрации

В PHP для очистки текста от HTML-разметки можно использовать функцию filter_var() с флагом FILTER_SANITIZE_STRING. Она удаляет теги и специальные символы, оставляя только текстовое содержимое:
$clean = filter_var($input, FILTER_SANITIZE_STRING);
Начиная с PHP 8.1, данный фильтр признан устаревшим. Рекомендуется использовать FILTER_UNSAFE_RAW с опцией FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH для удаления управляющих символов:
$clean = filter_var($input, FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH);
$safe = htmlspecialchars($clean, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
Таким образом, встроенные фильтры позволяют быстро удалять разметку, контролировать диапазон допустимых символов и повышать безопасность обработки данных.
Сравнение работы strip_tags() и preg_replace()

Функция strip_tags() предназначена для быстрого удаления HTML и PHP тегов из строки. Она обеспечивает базовую очистку, сохраняя текст между тегами, и позволяет указать список разрешённых тегов через второй параметр. Например, strip_tags('<b>Пример</b>', '<b>') сохранит тег <b>, удалив остальные. Производительность strip_tags() выше при работе с большими текстами, так как функция написана на уровне ядра PHP и не использует регулярные выражения.
preg_replace() предоставляет гибкий механизм удаления тегов с помощью регулярных выражений. Это позволяет удалять только определённые теги, их атрибуты или сложные конструкции HTML. Пример: preg_replace('/<script.*?>.*?<\/script>/is', '', $text) удаляет все <script>-блоки, включая содержимое. Недостаток preg_replace() – при неверно составленном шаблоне возможны ошибки и удаление необходимого контента. Также регулярные выражения могут снижать производительность на больших объёмах текста.
Использование strip_tags() оправдано, если требуется простое удаление всех тегов или сохранение ограниченного набора. preg_replace() подходит для точечной очистки, когда необходимо удалить специфические теги или их атрибуты, сохранив остальной HTML. Для смешанных случаев рекомендуют сначала применять strip_tags() с разрешёнными тегами, а затем фильтровать критические элементы через preg_replace(), обеспечивая безопасность и точность.
Тесты показывают, что strip_tags() обрабатывает тексты размером 1 МБ примерно за 0,002–0,004 секунды, тогда как эквивалентный preg_replace() с несколькими сложными шаблонами может занимать 0,01–0,02 секунды. Поэтому для больших массивов данных приоритетнее strip_tags(), а для специализированной очистки – preg_replace().
Очистка пользовательского ввода от HTML тегов

В PHP удаление HTML тегов из пользовательского ввода необходимо для предотвращения XSS-уязвимостей и корректной обработки данных. Существует несколько эффективных методов очистки, каждый из которых имеет свои особенности.
- Функция
strip_tags()– базовое средство удаления тегов. Она принимает два параметра: строку и необязательный список разрешённых тегов. Пример:$clean = strip_tags($input, '<b><i>');Оставляет только указанные теги, все остальные удаляет.
- Функция
htmlspecialchars()– преобразует HTML-символы в безопасные сущности. Она не удаляет теги, но предотвращает их интерпретацию браузером:$safe = htmlspecialchars($input, ENT_QUOTES, 'UTF-8'); - Регулярные выражения – позволяют гибко фильтровать теги и атрибуты. Пример удаления всех тегов:
$clean = preg_replace('/<[^>]+>/', '', $input);Требует аккуратной настройки, чтобы избежать случайного удаления текста.
Для сложных случаев рекомендуется использовать специализированные библиотеки:
- HTML Purifier – полностью безопасная очистка HTML с сохранением разрешённой разметки.
- DOMDocument – парсинг и фильтрация тегов через DOM-структуру, позволяет удалять отдельные элементы или атрибуты программно.
- Определить, какие теги разрешены.
- Применить
strip_tags()для удаления всех лишних тегов. - Для сложных форматов использовать HTML Purifier или DOMDocument.
Вопрос-ответ:
Какая функция в PHP позволяет убрать HTML-теги из строки?
В PHP для удаления HTML-тегов чаще всего используют функцию strip_tags(). Она принимает строку с кодом HTML и возвращает текст без тегов. Например, strip_tags("<b>Привет</b>") вернёт просто «Привет». Также функция позволяет указать, какие теги оставлять, передав их вторым параметром.
Можно ли удалить теги HTML, сохранив при этом некоторые из них?
Да, функция strip_tags() поддерживает опцию разрешённых тегов. Например, strip_tags("<b>Текст</b> <i>курсив</i>", "<b>") удалит все теги, кроме <b>. Это удобно, если нужно оставить форматирование вроде жирного или курсива, но убрать остальные элементы разметки.
Можно ли использовать регулярные выражения для удаления HTML-тегов в PHP?
Регулярные выражения применимы, однако их использование требует осторожности. Простейший пример — preg_replace("/<[^>]+>/", "", $text). Этот способ удаляет все содержимое тегов, но он не всегда корректно работает с вложенными или сложными структурами. Для сложного HTML лучше использовать парсеры, чтобы избежать ошибок.
Как удалить теги HTML, используя DOMDocument?
PHP предоставляет класс DOMDocument, с помощью которого можно загружать HTML и работать с элементами напрямую. Для удаления тегов создают объект DOMDocument, загружают HTML через loadHTML(), затем обходят все элементы и удаляют нужные. После этого остаётся чистый текст. Этот метод надёжнее, чем регулярные выражения, особенно при сложной структуре.
Есть ли способ полностью очистить строку от HTML и спецсимволов одновременно?
Да, для этого можно комбинировать strip_tags() с html_entity_decode() или htmlspecialchars_decode(). Сначала удаляются теги, затем специальные HTML-сущности, такие как или <. Например: $clean = html_entity_decode(strip_tags($html)). В результате получаем текст без тегов и без HTML-сущностей.
Какие функции PHP можно использовать для удаления HTML-тегов из строки?
В PHP существует несколько способов удалить HTML-теги. Наиболее простой вариант — использовать функцию strip_tags(), которая удаляет все HTML и PHP теги из строки. Также можно использовать регулярные выражения с preg_replace(), если нужно более точное управление тем, какие теги удалять, а какие оставить. Иногда используют комбинацию функций trim() и str_replace() для очистки конкретных символов или тегов.
Можно ли удалить теги, сохранив текст между ними, и как это сделать?
Да, можно удалить теги, оставив текст между ними. Функция strip_tags() автоматически сохраняет текст, удаляя только сами теги. Например, если в строке есть <b>Пример</b>, после применения strip_tags() останется «Пример». Для более сложных случаев, например при частичном удалении тегов или фильтрации определённых элементов, используют preg_replace() с регулярными выражениями. Это позволяет удалять только нужные теги, не затрагивая текст внутри них.
