Html entity decode: примеры (PHP)

Преобразование HTML-сущностей: работа с функцией html_entity_decode
Раздел: HTML
html_entity_decode(string $string, int $flags = ENT_COMPAT | ENT_HTML401, ?string $encoding = null): string

Функция html_entity_decode() в PHP преобразует HTML-сущности обратно в их соответствующие символы. Она выполняет операцию, обратную htmlentities().

Когда используется

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

Аргументы функции
string html_entity_decode(string $string, int $flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401, ?string $encoding = null)
  • $string (обязательный): Входная строка, содержащая HTML-сущности.
  • $flags (опциональный): Битовая маска из одной или нескольких констант, определяющих режим обработки кавычек и документ-тип. По умолчанию: ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401.
    • ENT_COMPAT: Преобразует двойные кавычки, оставляет одинарные как есть.
    • ENT_QUOTES: Преобразует и двойные, и одинарные кавычки.
    • ENT_NOQUOTES: Не преобразует никакие кавычки.
    • ENT_HTML401: Обработка кода как HTML 4.01.
    • ENT_XML1: Обработка кода как XML 1.
    • ENT_XHTML: Обработка кода как XHTML.
    • ENT_HTML5: Обработка кода как HTML5.
    • ENT_SUBSTITUTE: Заменяет недопустимые кодовые последовательности на символ замены Unicode (�) вместо возврата пустой строки.
    • ENT_DISALLOWED: Заменяет кодовые точки, недопустимые для указанного типа документа, на символ замены.
    • ENT_IGNORE: Устаревшая константа. Не рекомендуется к использованию.
  • $encoding (опциональный): Кодировка, используемая при преобразовании. Если null, используется кодировка из текущего файла PHP (настройка default_charset). Поддерживаемые значения: 'UTF-8', 'ISO-8859-1', 'Windows-1251' и другие.
Пример 1: Базовое использование
<?php
$str = "&lt;span&gt;Текст&lt;/span&gt;";
echo html_entity_decode($str);
?>
<span>Текст</span>
Пример 2: Работа с кавычками и флагами
<?php
$str = "&quot;Одинокая кавычка&apos; внутри&quot;";
echo "ENT_QUOTES: ".html_entity_decode($str, ENT_QUOTES)."\n";
echo "ENT_COMPAT: ".html_entity_decode($str, ENT_COMPAT)."\n";
echo "ENT_NOQUOTES: ".html_entity_decode($str, ENT_NOQUOTES)."\n";
?>
ENT_QUOTES: "Одинокая кавычка' внутри"
ENT_COMPAT: "Одинокая кавычка' внутри"
ENT_NOQUOTES: "Одинокая кавычка' внутри"
Пример 3: Указание кодировки
<?php
$str = "&euro; &amp; &copy;"; // Символы в Windows-1252/ISO-8859-1
// Без указания кодировки (по умолчанию UTF-8) символ евро может не декодироваться
echo html_entity_decode($str, ENT_QUOTES, 'ISO-8859-1');
?>
€ & ©

В PHP существуют другие функции для работы с HTML-сущностями и специальными символами:

  • htmlspecialchars_decode(): Декодирует только специальные символы HTML (&amp;, &quot;, &lt;, &gt;, &apos;). Не обрабатывает именованные сущности вроде &copy; или &nbsp;. Используется, когда нужно декодировать только минимальный набор для безопасности.
  • strip_tags(): Удаляет теги HTML и PHP из строки. Не декодирует сущности, а просто удаляет сам тег. Используется для полного удаления разметки, а не для преобразования символов.
  • urldecode() / rawurldecode(): Декодируют строку, закодированную для URL (проценты). Работают с другим типом кодирования, не с HTML-сущностями.

Функцию html_entity_decode() предпочтительнее использовать, когда нужно преобразовать все HTML-сущности обратно в символы, особенно при работе с текстом, сохраненным функцией htmlentities().

Python (библиотека html)
import html
result = html.unescape('&lt;span&gt;Текст&lt;/span&gt; &copy;')
print(result)
<span>Текст</span> ©

Функция html.unescape() декодирует все именованные и числовые HTML-сущности. В отличие от PHP, не требует указания флагов для кавычек или типа документа, обработка более автоматизирована.

JavaScript
const parser = new DOMParser();
const decodedString = parser.parseFromString('&lt;span&gt;Текст&lt;/span&gt;', 'text/html').documentElement.textContent;
console.log(decodedString); // Альтернатива: использование textarea или div с innerHTML
// Или с помощью временного элемента:
const textArea = document.createElement('textarea');
textArea.innerHTML = '&lt;span&gt;Текст&lt;/span&gt;';
console.log(textArea.value);
<span>Текст</span>

В JavaScript нет прямой аналогичной функции. Обычно используют парсинг через DOMParser или присваивание innerHTML временному элементу с последующим чтением текстового содержимого. Это менее прямое решение, чем в PHP.

MySQL
-- Нет встроенной функции для декодирования HTML-сущностей.
-- Обычно обработка происходит на стороне приложения (PHP, Python).
-- Можно использовать замену через REPLACE, но только для известных сущностей:
SELECT REPLACE(REPLACE(column, '&amp;', '&'), '&lt;', '<') FROM table;

В SQL (MySQL) прямой замены нет, что подчеркивает необходимость обработки на уровне приложения.

1. Неправильная кодировка

Если кодировка строки не совпадает с указанной в параметре $encoding, символы могут декодироваться некорректно или оставаться сущностями.

<?php
$str = "&ruble;"; // Сущность для рубля (в UTF-8)
echo html_entity_decode($str, ENT_QUOTES, 'ISO-8859-1'); // Неверная кодировка
?>
&ruble; // Сущность не декодировалась
2. Попытка декодирования без сущностей

Функция не изменяет строку, если в ней нет валидных HTML-сущностей. Это не ошибка, но может ввести в заблуждение.

<?php
$str = "Просто текст < > & ' \"";
echo html_entity_decode($str);
?>
Просто текст < > & ' "
3. Использование устаревшего флага ENT_IGNORE

Флаг ENT_IGNORE устарел и может привести к неожиданному поведению или предупреждениям в новых версиях PHP.

<?php
// Не рекомендуется
$str = "&#x1F600;"; // Смайлик
@echo html_entity_decode($str, ENT_QUOTES | ENT_IGNORE, 'UTF-8');
?>
???? // Может работать, но флаг устарел

В PHP 8.1 параметр $encoding стал nullable (может принимать значение null). В этом случае используется кодировка из настройки default_charset (по умолчанию UTF-8). Ранее значение по умолчанию было ini_get('default_charset'), но тип параметра не позволял явно передать null.

В более ранних версиях, до PHP 5.4, использовалась кодировка ISO-8859-1 по умолчанию, что часто приводило к проблемам с кириллицей и другими нелатинскими символами.

<?php
// PHP 8.1+
$str = "&euro;";
echo html_entity_decode($str, encoding: null); // Явная передача null
?>
€ // Если default_charset = 'UTF-8'
Обработка числовых сущностей
Пример php
<?php
$str = "Десятичная: &#1072; Шестнадцатеричная: &#x43E;"; // Буквы 'а' и 'о'
echo html_entity_decode($str, ENT_QUOTES, 'UTF-8');
?>
Десятичная: а Шестнадцатеричная: о
Комбинация флагов ENT_SUBSTITUTE и ENT_DISALLOWED
Пример php
<?php
// ENT_SUBSTITUTE заменяет недопустимые последовательности
$str = "&#x1F600; &#x110000;"; // 0x110000 - недопустимая кодовая точка Unicode
echo html_entity_decode($str, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
?>
???? �
Работа с разными типами документов (HTML5 vs HTML4)
Пример php
<?php
$str = "&apos; &rsquo; &frac14;";
echo "HTML5: ".html_entity_decode($str, ENT_QUOTES | ENT_HTML5)."\n";
echo "HTML401: ".html_entity_decode($str, ENT_QUOTES | ENT_HTML401)."\n";
?>
HTML5: ' ’ ¼
HTML401: ' ’ ¼
Декодирование вложенных сущностей

Функция не выполняет рекурсивное декодирование. Если сущность была закодирована несколько раз, потребуется многократный вызов.

Пример php
<?php
$str = "&amp;lt;span&amp;gt;"; // Двойное кодирование: &lt; -> &amp;lt;
echo html_entity_decode($str)."\n";
echo html_entity_decode(html_entity_decode($str));
?>
&lt;span&gt;
<span>
Обработка пользовательского ввода перед выводом в не-HTML контекст
Пример php
<?php
// Данные из формы, сохраненные в БД как сущности
$userInputFromDb = "Привет, &lt;script&gt;alert('xss')&lt;/script&gt;";
// Для вывода в текстовом файле или консоли нужно декодировать
$cleanForText = html_entity_decode($userInputFromDb, ENT_QUOTES, 'UTF-8');
file_put_contents('log.txt', $cleanForText);
?>
Содержимое файла log.txt: Привет, <script>alert('xss')</script>

PHP html_entity_decode function comments

En
Html entity decode Convert HTML entities to their corresponding characters