Htmlspecialchars decode: примеры (PHP)

Преобразование HTML-сущностей обратно в символы с htmlspecialchars_decode
Раздел: HTML
htmlspecialchars_decode(string $string, int $flags = ENT_COMPAT | ENT_HTML401): string

Описание функции htmlspecialchars_decode

Функция htmlspecialchars_decode в PHP предназначена для преобразования специальных HTML-сущностей обратно в соответствующие символы. Это обратная операция для функции htmlspecialchars. Использование функции актуально при выводе ранее экранированных данных, когда требуется восстановить исходные символы для дальнейшей обработки или безопасного отображения в определённых контекстах.

Аргументы функции
  • string $string - обязательный параметр, строка, содержащая HTML-сущности для преобразования.
  • int $flags - необязательный параметр, определяющий правила обработки кавычек и тип документа. По умолчанию ENT_COMPAT | ENT_HTML401. Возможные значения:
    • ENT_COMPAT - преобразует двойные кавычки, оставляет одинарные без изменений.
    • ENT_QUOTES - преобразует и двойные, и одинарные кавычки.
    • ENT_NOQUOTES - не преобразует кавычки.
    • ENT_HTML401 - обработка для HTML 4.01.
    • ENT_XML1 - обработка для XML 1.
    • ENT_XHTML - обработка для XHTML.
    • ENT_HTML5 - обработка для HTML5.
  • string|null $encoding - необязательный параметр, задающий кодировку. Начиная с PHP 8.0.0, значение по умолчанию null означает использование внутренней кодировки (default_charset).

Примеры использования htmlspecialchars_decode

Базовое применение

Преобразование основных сущностей.

<?php
$str = "&lt;a href=&#039;test&#039;&gt;link&lt;/a&gt;";
echo htmlspecialchars_decode($str);
?>
<a href='test'>link</a>
Использование флага ENT_QUOTES
<?php
$str = "&lt;a href=&#039;test&#039;&gt;link&lt;/a&gt;";
echo htmlspecialchars_decode($str, ENT_QUOTES);
?>
<a href='test'>link</a>
Использование флага ENT_NOQUOTES
<?php
$str = "&quot;Hello&quot; &amp; &#039;World&#039;";
echo htmlspecialchars_decode($str, ENT_NOQUOTES);
?>
"Hello" & 'World'

Похожие функции в PHP

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

strip_tags

Функция strip_tags удаляет HTML и PHP-теги из строки. Она применяется, когда необходимо полностью удалить разметку, а не преобразовывать сущности. Функция не восстанавливает символы из сущностей.

Выбор функции

Функцию htmlspecialchars_decode используют для обратного преобразования сущностей, созданных функцией htmlspecialchars. Если исходные данные были обработаны через htmlentities, то применяют html_entity_decode. Для удаления разметки подходит strip_tags.

Аналоги в других языках

Htmlspecialchars decode в Python

В языке Python функция html.unescape() из модуля html выполняет аналогичные действия.

import html
str = "&lt;a href=&#039;test&#039;&gt;link&lt;/a&gt;"
print(html.unescape(str))
<a href='test'>link</a>

Htmlspecialchars decode в Javascript

В JavaScript для преобразования HTML-сущностей используют свойство innerHTML элемента или функцию he.decode из библиотеки he.

const str = "&lt;a href=&#039;test&#039;&gt;link&lt;/a&gt;";
const textArea = document.createElement('textarea');
textArea.innerHTML = str;
console.log(textArea.value);
<a href='test'>link</a>

Htmlspecialchars decode в MySQL

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

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

Двойное преобразование

Неоднократный вызов функции приводит к непредвиденным результатам.

<?php
$str = "&amp;lt;";
echo htmlspecialchars_decode(htmlspecialchars_decode($str));
?>
&lt;
Неправильный флаг

Использование флага, не соответствующего способу первоначального экранирования.

<?php
$str = "&#039;test&#039;";
// Если исходное преобразование использовало ENT_QUOTES
// А декодирование — ENT_COMPAT
$result = htmlspecialchars_decode($str, ENT_COMPAT);
echo $result;
?>
&#039;test&#039;
Ошибки кодировки

Несоответствие кодировки может привести к некорректному преобразованию символов.

Изменения в PHP

PHP 8.0.0

Параметр encoding стал необязательным. Значение по умолчанию изменено на null, что приводит к использованию внутренней кодировки. Функция теперь возвращает пустую строку при передаче неверной кодировки, вместо выдачи предупреждения.

PHP 5.4.0

Добавлены константы ENT_HTML401, ENT_XML1, ENT_XHTML и ENT_HTML5.

Расширенные примеры

Обработка массива данных

Функция применяется ко всем элементам массива.

Пример php
<?php
$data = [
    'title' => "&lt;h1&gt;Title&lt;/h1&gt;",
    'desc' => "&amp;copy; 2023"
];
$decoded = array_map('htmlspecialchars_decode', $data);
print_r($decoded);
?>
Array
(
    [title] => <h1>Title</h1>
    [desc] => &copy; 2023
)
Комбинирование с другими функциями

Очистка строки с последующим преобразованием.

Пример php
<?php
$str = "   &lt;p&gt;Text&lt;/p&gt;   ";
$result = htmlspecialchars_decode(trim($str));
echo $result;
?>
<p>Text</p>
Использование с HTML5
Пример php
<?php
$str = "&lt;section&gt;&amp;ndash;content&lt;/section&gt;";
echo htmlspecialchars_decode($str, ENT_QUOTES | ENT_HTML5);
?>
<section>&ndash;content</section>
Обработка многострочного текста
Пример php
<?php
$text = "&lt;pre&gt;Line 1
Line 2&lt;/pre&gt;";
echo htmlspecialchars_decode($text);
?>
<pre>Line 1
Line 2</pre>
Восстановление данных из JSON
Пример php
<?php
$json = '{"text": "&lt;div&gt;Test&lt;/div&gt;"}';
$data = json_decode($json, true);
$data['text'] = htmlspecialchars_decode($data['text']);
echo $data['text'];
?>
<div>Test</div>

PHP htmlspecialchars_decode function comments

En
Htmlspecialchars decode Convert special HTML entities back to characters