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.

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

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

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

<?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>

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

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 htmlspecialchars_decode function comments

En
Htmlspecialchars decode Convert special HTML entities back to characters