Убираем HTML-теги из строки в PHP: основные варианты

Раздел: Операции с данными -> Работа со строками

Удаление HTML-тегов в PHP: основные способы

Как удалить все HTML-теги из строки?

Наиболее простой и быстрый способ - использование встроенной функции strip_tags(). Она удаляет все HTML-теги (включая PHP-теги) и возвращает текст без разметки.


<?php
$html = '<p>Привет, <b>мир</b>!</p>';
$clean = strip_tags($html);
echo $clean;
?>
  

удалить html теги php (php удалить html теги)

Привет, мир!
  

Php без учета регистра (игнорирование регистра в php)

Функция принимает второй необязательный параметр - список разрешённых тегов (в виде строки). Если указать разрешённые теги, они не будут удалены.


<?php
$html = '<p>Привет, <b>мир</b>!</p>';
$clean = strip_tags($html, '<b>');
echo $clean;
?>
  

Php new line (символ новой строки в php)

Привет, <b>мир</b>!
  

Php маленькие буквы (преобразование строки в нижний регистр в php)

Внимание: strip_tags() не проверяет валидность HTML и может некорректно обрабатывать вложенные теги или атрибуты, содержащие символы < и >.

Типичные ошибки:

  • Если строка содержит незакрытые теги, результат может содержать лишние фрагменты.
  • Функция удаляет только открывающие и закрывающие теги, но не их атрибуты (например, <a href="..."> - атрибут href останется, если тег разрешён).
  • strip_tags() не удаляет комментарии <!-- ... --> и PHP-теги с короткими открывающими тегами (<? ... ?> может не сработать).

Как удалить только определённые теги, оставив остальные?

Если требуется удалить только конкретные теги (например, всё, кроме <b> и <i>), можно использовать strip_tags() с вторым параметром, перечисляя разрешённые теги. Однако этот подход удаляет все неуказанные теги.


<?php
$html = '<p>Текст <b>жирный</b> и <i>курсив</i></p>';
$clean = strip_tags($html, '<b><i>');
echo $clean;
?>
  

Php end of line (символ конца строки в php)

Текст <b>жирный</b> и <i>курсив</i>
  

удалить пробел в строке php (php удалить пробелы в строке)

Как удалить HTML-теги с помощью регулярных выражений?

Регулярные выражения предоставляют гибкость, но их использование для разбора HTML может привести к ошибкам на сложных строках. Простейшее выражение: preg_replace('/<[^>]*>/', '', $html). Оно удаляет всё, что похоже на тег.


<?php
$html = '<p>Привет, <b>мир</b>!</p>';
$clean = preg_replace('/<[^>]*>/', '', $html);
echo $clean;
?>
  

Php первая заглавная (преобразование первой буквы в заглавную в php)

Привет, мир!
  

Php strip tags (удаление html тегов функцией strip_tags)

Важно: такое регулярное выражение не учитывает многострочные теги, атрибуты с символами < и > внутри значений, а также не закрытые теги. Для корректной очистки сложного HTML лучше использовать DOM-парсер.

Проблемы и решения:

  • Если внутри атрибута есть символ > (например, <img title="a>b">), регулярное выражение обрежет неверно. Решение: использовать более сложное выражение или DOM.
  • Регулярное выражение не удаляет HTML-комментарии (<!-- ... -->) - их нужно обрабатывать отдельно.

Как удалить HTML-теги при помощи DOMDocument?

Класс DOMDocument позволяет анализировать HTML корректно, даже если разметка невалидна. Можно пройтись по всем узлам и извлечь только текстовое содержимое.


<?php
$html = '<p>Привет, <b>мир</b>!</p>';
$dom = new DOMDocument();
@$dom->loadHTML('<meta charset="UTF-8">' . $html); // @ подавляет warnings
$xpath = new DOMXPath($dom);
$text = '';
foreach ($xpath->query('//text()') as $node) {
    $text .= $node->nodeValue;
}
echo $text;
?>
  

Php вхождение подстроки (поиск подстроки в строке в php)

Привет, мир!
  

Php str contains (проверка наличия подстроки в php)

Этот метод надёжнее регулярных выражений, но требует больше кода и ресурсов. Он корректно обрабатывает вложенные, сломанные теги и сущности.

Возможные проблемы:

  • loadHTML() добавляет стандартные обёртки (html, body). Их нужно игнорировать или удалять после парсинга.
  • Для старых версий PHP могут потребоваться настройки libxml.

Как удалить HTML-теги и преобразовать спецсимволы?

Иногда требуется не просто удалить теги, но и преобразовать HTML-сущности (например, &nbsp; в пробел). После удаления тегов можно применить html_entity_decode().


<?php
$html = '<p>Привет & мир</p>';
$withoutTags = strip_tags($html);
$decoded = html_entity_decode($withoutTags, ENT_QUOTES, 'UTF-8');
echo $decoded;
?>
  

Php первые символов (получение первых символов строки в php)

Привет & мир
  

Php проверить строку (проверить строку в php)

Как удалить только теги, но оставить их содержимое?

Все приведённые методы (strip_tags, preg_replace, DOM) по умолчанию оставляют содержимое тегов. Если же нужно удалить и содержимое определённых тегов (например, <script>), следует обрабатывать их отдельно.

Пример удаления тегов <script> вместе с содержимым с помощью регулярного выражения:


<?php
$html = '<script>alert("test")</script><p>Текст</p>';
$clean = preg_replace('/<script[^>]*>.*?<\/script>/si', '', $html);
echo $clean;
?>
  

Str search php (поиск в строке php)

<p>Текст</p>
  

Php длина строки (длина строки php)

Для надёжного удаления определённых тегов с содержимым лучше использовать DOMDocument.

Как удалить атрибуты тегов, оставив сами теги?

Для очистки атрибутов (например, оставить только текст тегов) можно использовать preg_replace_callback или DOMDocument. Пример с регулярным выражением:


<?php
$html = '<a href="http://example.com" class="link">ссылка</a>';
$clean = preg_replace('/<(\w+)\s+[^>]*>/', '<$1>', $html);
echo $clean;
?>
  

Php str replace (замена в строке php)

<a>ссылка</a>
  

Это заменяет открывающие теги на упрощённые без атрибутов. Следует помнить о вложенных кавычках и экранировании.

- Php preg (регулярные выражения в php (preg))
- Php encode (кодирование строк в php (encode))
- Php символ строки (работа с символами строки в php)

Расширенные примеры удаления HTML-тегов в PHP

Как удалить все теги, кроме разрешённых, с помощью DOM?

Использование DOMDocument и XPath позволяет точно контролировать, какие теги оставить. Пример оставляет только параграфы и ссылки:

Пример

<?php
$html = '<div><p>Текст <b>жирный</b></p><a href="#">ссылка</a></div>';
$dom = new DOMDocument();
@$dom->loadHTML('<meta charset="UTF-8">' . $html, LIBXML_NOERROR);
$xpath = new DOMXPath($dom);
$allowed = ['p', 'a'];
// Собираем все узлы, потом удаляем неразрешённые
$nodes = $xpath->query('//*');
foreach ($nodes as $node) {
    if (!in_array($node->nodeName, $allowed)) {
        // Заменяем узел на его текстовое содержимое
        while ($node->childNodes->length > 0) {
            $child = $node->removeChild($node->childNodes->item(0));
            $node->parentNode->insertBefore($child, $node);
        }
        $node->parentNode->removeChild($node);
    }
}
// Извлекаем HTML после изменений
$result = $dom->saveHTML();
echo $result;
?>
<p>Текст жирный</p><a href="#">ссылка</a>

Как удалить все теги, но сохранить только текст внутри <script> и <style>?

Если нужно полностью удалить скрипты и стили, проще всего сначала удалить сами блоки с содержимым, а затем остальные теги. Регулярное выражение с модификаторами s и i может справиться, но лучше использовать DOM:

Пример

<?php
$html = '<script>alert(1)</script><p>текст</p><style>.c{color:red}</style>';
$dom = new DOMDocument();
@$dom->loadHTML($html, LIBXML_NOERROR);
$xpath = new DOMXPath($dom);
foreach (['script', 'style'] as $tag) {
    foreach ($xpath->query('//' . $tag) as $node) {
        $node->parentNode->removeChild($node);
    }
}
$clean = strip_tags($dom->saveHTML());
echo $clean;
?>
текст

Как удалить HTML-теги из строки с сохранением переносов строк?

После удаления тегов часто теряются переносы строк, содержащиеся в исходном HTML (например, внутри <br>). Можно добавить замену <br> на символ новой строки перед удалением тегов:

Пример

<?php
$html = '<p>Строка 1</p><br><p>Строка 2</p>';
$html = str_ireplace('<br>', "\n", $html);
$html = str_ireplace('<br/>', "\n", $html);
$html = str_ireplace('<br />', "\n", $html);
$clean = strip_tags($html);
echo $clean;
?>
Строка 1
Строка 2

Как безопасно удалить HTML-теги из пользовательского ввода (XSS-защита)?

Для защиты от XSS недостаточно просто удалить теги. Рекомендуется использовать htmlspecialchars() вместе с strip_tags(), либо фильтровать через filter_var() с флагом FILTER_SANITIZE_STRING (но он устарел). Современный подход: разрешить только безопасные теги через библиотеку HTMLPurifier.

Пример

<?php
$userInput = '<script>alert(1)</script><p>Привет</p>';
// Простой вариант: удалить все теги
$safe = strip_tags($userInput);
echo $safe; // alert(1)Привет
?>
alert(1)Привет

Обратите внимание: текст внутри скрипта остался. Поэтому для полной очистки нужно удалять скрипты и стили вместе с содержимым перед strip_tags.

Как удалить все теги, кроме ссылок, но сохранить текст ссылок?

Используем DOM для построения списка разрешённых тегов. Пример оставляет только <a>:

Пример

<?php
$html = '<div><a href="#">Ссылка 1</a> <b>жирный</b></div>';
$dom = new DOMDocument();
@$dom->loadHTML($html, LIBXML_NOERROR);
$xpath = new DOMXPath($dom);
foreach ($xpath->query('//*[not(self::a)]') as $node) {
    // заменяем узел на его потомков (текст)
    while ($node->childNodes->length > 0) {
        $child = $node->removeChild($node->childNodes->item(0));
        $node->parentNode->insertBefore($child, $node);
    }
    $node->parentNode->removeChild($node);
}
$result = $dom->saveHTML();
// Дополнительно удалить пустые текстовые узлы? Но в данном случае всё нормально.
echo $result;
?>
<a href="#">Ссылка 1</a> жирный

php удалить html теги - comments

En
удалить html теги php (php)