Html entity decode: примеры (PHP)
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'и другие.
<?php
$str = "<span>Текст</span>";
echo html_entity_decode($str);
?><span>Текст</span>
<?php
$str = ""Одинокая кавычка' внутри"";
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: "Одинокая кавычка' внутри"
<?php
$str = "€ & ©"; // Символы в Windows-1252/ISO-8859-1
// Без указания кодировки (по умолчанию UTF-8) символ евро может не декодироваться
echo html_entity_decode($str, ENT_QUOTES, 'ISO-8859-1');
?>€ & ©
В PHP существуют другие функции для работы с HTML-сущностями и специальными символами:
- htmlspecialchars_decode(): Декодирует только специальные символы HTML (&, ", <, >, '). Не обрабатывает именованные сущности вроде © или . Используется, когда нужно декодировать только минимальный набор для безопасности.
- strip_tags(): Удаляет теги HTML и PHP из строки. Не декодирует сущности, а просто удаляет сам тег. Используется для полного удаления разметки, а не для преобразования символов.
- urldecode() / rawurldecode(): Декодируют строку, закодированную для URL (проценты). Работают с другим типом кодирования, не с HTML-сущностями.
Функцию html_entity_decode() предпочтительнее использовать, когда нужно преобразовать все HTML-сущности обратно в символы, особенно при работе с текстом, сохраненным функцией htmlentities().
import html
result = html.unescape('<span>Текст</span> ©')
print(result)<span>Текст</span> ©
Функция html.unescape() декодирует все именованные и числовые HTML-сущности. В отличие от PHP, не требует указания флагов для кавычек или типа документа, обработка более автоматизирована.
const parser = new DOMParser();
const decodedString = parser.parseFromString('<span>Текст</span>', 'text/html').documentElement.textContent;
console.log(decodedString); // Альтернатива: использование textarea или div с innerHTML
// Или с помощью временного элемента:
const textArea = document.createElement('textarea');
textArea.innerHTML = '<span>Текст</span>';
console.log(textArea.value);<span>Текст</span>
В JavaScript нет прямой аналогичной функции. Обычно используют парсинг через DOMParser или присваивание innerHTML временному элементу с последующим чтением текстового содержимого. Это менее прямое решение, чем в PHP.
-- Нет встроенной функции для декодирования HTML-сущностей.
-- Обычно обработка происходит на стороне приложения (PHP, Python).
-- Можно использовать замену через REPLACE, но только для известных сущностей:
SELECT REPLACE(REPLACE(column, '&', '&'), '<', '<') FROM table;В SQL (MySQL) прямой замены нет, что подчеркивает необходимость обработки на уровне приложения.
Если кодировка строки не совпадает с указанной в параметре $encoding, символы могут декодироваться некорректно или оставаться сущностями.
<?php
$str = "&ruble;"; // Сущность для рубля (в UTF-8)
echo html_entity_decode($str, ENT_QUOTES, 'ISO-8859-1'); // Неверная кодировка
?>&ruble; // Сущность не декодировалась
Функция не изменяет строку, если в ней нет валидных HTML-сущностей. Это не ошибка, но может ввести в заблуждение.
<?php
$str = "Просто текст < > & ' \"";
echo html_entity_decode($str);
?>Просто текст < > & ' "
Флаг ENT_IGNORE устарел и может привести к неожиданному поведению или предупреждениям в новых версиях PHP.
<?php
// Не рекомендуется
$str = "😀"; // Смайлик
@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 = "€";
echo html_entity_decode($str, encoding: null); // Явная передача null
?>€ // Если default_charset = 'UTF-8'
<?php
$str = "Десятичная: а Шестнадцатеричная: о"; // Буквы 'а' и 'о'
echo html_entity_decode($str, ENT_QUOTES, 'UTF-8');
?>Десятичная: а Шестнадцатеричная: о
<?php
// ENT_SUBSTITUTE заменяет недопустимые последовательности
$str = "😀 �"; // 0x110000 - недопустимая кодовая точка Unicode
echo html_entity_decode($str, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
?>???? �
<?php
$str = "' ’ ¼";
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
$str = "&lt;span&gt;"; // Двойное кодирование: < -> &lt;
echo html_entity_decode($str)."\n";
echo html_entity_decode(html_entity_decode($str));
?><span> <span>
<?php
// Данные из формы, сохраненные в БД как сущности
$userInputFromDb = "Привет, <script>alert('xss')</script>";
// Для вывода в текстовом файле или консоли нужно декодировать
$cleanForText = html_entity_decode($userInputFromDb, ENT_QUOTES, 'UTF-8');
file_put_contents('log.txt', $cleanForText);
?>Содержимое файла log.txt: Привет, <script>alert('xss')</script>