htmlspecialchars_decode()
Статья о функции PHP htmlspecialchars_decode(), которая используется для преобразования HTML-сущностей обратно в соответствующие символы.
Функция htmlspecialchars_decode() выполняет обратную операцию по сравнению с htmlspecialchars(): она преобразует пять специальных HTML-сущностей (&, <, >, ", ') обратно в их буквальные символы (&, <, >, ", ').
Она обычно нужна, когда строка уже была закодирована для безопасного отображения в HTML и вам снова нужны исходные символы — например, для хранения оригинального текста, сравнения с незакодированными входными данными или передачи в систему, ожидающую буквальную разметку.
На этой странице рассматривается синтаксис, аргумент $flags и его влияние на кавычки, отличие от html_entity_decode(), а также важное замечание по безопасности, которое необходимо знать перед использованием.
Синтаксис
htmlspecialchars_decode(string $string, int $flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401): string| Параметр | Обязательный | Описание |
|---|---|---|
$string | Да | Строка, содержащая HTML-сущности для декодирования. |
$flags | Нет | Битовая маска, управляющая обработкой кавычек и типом документа. |
Функция возвращает декодированную строку. Преобразуются только сущности, созданные функцией htmlspecialchars() — для полного набора именованных и числовых HTML-сущностей используйте html_entity_decode().
Примечание: значение
$flagsпо умолчанию изменилось в PHP 8.1 сENT_COMPAT | ENT_HTML401наENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401. Примеры ниже работают одинаково в обоих случаях.
Базовый пример
Пример использования htmlspecialchars_decode() в PHP
В этом примере переменная $html_string содержит строку с HTML-кодом, включающим сущности. Функция htmlspecialchars_decode() преобразует HTML-сущности в соответствующие символы.
Результат выполнения этого кода:
<h1>Hello World</h1>Символы < и > были восстановлены из < и >.
Управление кавычками с помощью $flags
Второй аргумент, $flags, определяет, какие сущности кавычек будут декодированы. Вот наиболее часто используемые значения:
| Флаг | Влияние на кавычки |
|---|---|
ENT_QUOTES | Декодирует как двойные ("), так и одинарные (') кавычки. |
ENT_COMPAT | Декодирует двойные кавычки; при декодировании также декодирует одинарные кавычки. |
ENT_NOQUOTES | Оставляет " и ' без изменений. |
ENT_HTML5 | Обрабатывает входные данные как HTML5 (используйте в сочетании с флагом кавычек, например ENT_QUOTES | ENT_HTML5). |
Распространённая точка путаницы:
ENT_COMPATчасто ассоциируется с «только двойными кавычками», но это различие применимо только на стороне кодирования (htmlspecialchars()). При декодировании'преобразуется как приENT_QUOTES, так и приENT_COMPAT. Чтобы одинарные кавычки остались в закодированном виде, необходимо передатьENT_NOQUOTES.
Как использовать htmlspecialchars_decode() в PHP?
В этом примере переменная $html_string содержит строку с HTML-кодом и сущностями, включая закодированную одинарную кавычку. Функция htmlspecialchars_decode() вызывается с флагом ENT_QUOTES для преобразования HTML-сущностей в соответствующие символы, включая одинарную кавычку.
Результат выполнения этого кода:
<p>I'm a paragraph</p>Флаг ENT_QUOTES восстановил одинарную кавычку в I'm вместе с угловыми скобками.
htmlspecialchars_decode() vs html_entity_decode()
Обе функции преобразуют сущности обратно в символы, но работают с разными наборами:
htmlspecialchars_decode()декодирует только пять сущностей, создаваемых функциейhtmlspecialchars():&,<,>,"и'. Она быстра и предсказуема.html_entity_decode()декодирует полную таблицу HTML-сущностей, включая именованные сущности, такие как©, и€, а также числовые ссылки.
<?php
$text = "© 2024 & <Acme>";
// Leaves © untouched — it is not one of the five special chars
echo htmlspecialchars_decode($text); // © 2024 & <Acme>
echo "\n";
// Decodes © too
echo html_entity_decode($text); // © 2024 & <Acme>
?>Используйте htmlspecialchars_decode(), когда нужно только обратить результат вызова htmlspecialchars(). Прибегайте к html_entity_decode(), когда текст может содержать именованные сущности, такие как © или .
Замечание по безопасности
Декодирование превращает <script> обратно в живой тег <script>. Никогда не декодируйте строку и не выводите её на HTML-страницу без повторного экранирования, иначе вы снова открываете уязвимость межсайтового скриптинга (XSS). Декодируйте для хранения, сравнения или вывода не в HTML — и снова вызывайте htmlspecialchars() перед отправкой чего-либо в браузер.
Связанные функции
htmlspecialchars()— аналог для кодирования, обратный этой функции.html_entity_decode()— декодирует все HTML-сущности, не только пять специальных.htmlentities()— кодирует все применимые символы в сущности.strip_tags()— полностью удаляет HTML-теги вместо их декодирования.