Htmlentities: примеры (PHP)

Полное руководство по использованию htmlentities в PHP
Раздел: HTML
htmlentities(string $string, int $flags = ENT_COMPAT | ENT_HTML401, ?string $encoding = null, bool $double_encode = true): string
Основные сведения о htmlentities

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

Когда применяется функция

Использование функции актуально при отображении в браузере данных, полученных от пользователя или из внешних источников. Это гарантирует, что символы, имеющие специальное значение в HTML (например, <, >, &, "), будут отображены как текст, а не интерпретированы браузером как разметка.

Аргументы функции

Функция имеет следующую сигнатуру: htmlentities(string $string, int $flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401, ?string $encoding = null, bool $double_encode = true): string

  • $string – обрабатываемая строка.
  • $flags – комбинация констант, определяющих правила обработки. Основные: ENT_COMPAT, ENT_QUOTES, ENT_NOQUOTES, ENT_HTML401, ENT_XML1, ENT_XHTML, ENT_HTML5, ENT_SUBSTITUTE, ENT_DISALLOWED.
  • $encoding – кодировка строки (например, 'UTF-8'). Если null, используется внутренняя кодировка.
  • $double_encode – если false, уже существующие HTML-сущности не будут преобразованы повторно.
Базовые примеры использования
Простое экранирование
<?php
$text = '<script>alert("test")</script> & "цитата"';
echo htmlentities($text);
?>
&lt;script&gt;alert(&quot;test&quot;)&lt;/script&gt; &amp; &quot;цитата&quot;
Различные флаги quotes
<?php
$str = "'одинарная' и \"двойная\" кавычка";
echo htmlentities($str, ENT_NOQUOTES) . "\n";
echo htmlentities($str, ENT_COMPAT) . "\n";
echo htmlentities($str, ENT_QUOTES);
?>
'одинарная' и &quot;двойная&quot; кавычка
'одинарная' и &quot;двойная&quot; кавычка
&#039;одинарная&#039; и &quot;двойная&quot; кавычка
Использование ENT_SUBSTITUTE
<?php
// Строка с недопустимым UTF-8 символом
$str = "\x80Привет";
echo htmlentities($str, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
?>
�Привет
Похожие функции в PHP
  • htmlspecialchars() – преобразует только специальные символы HTML (<, >, &, "), в то время как htmlentities преобразует все символы, имеющие HTML-сущности. htmlspecialchars используется чаще для защиты от XSS.
  • strip_tags() – полностью удаляет HTML и PHP-теги из строки, но не экранирует их. Подходит для полного очищения текста от разметки.
  • addslashes() – экранирует кавычки, но для SQL-запросов следует использовать подготовленные выражения, а для HTML – htmlentities или htmlspecialchars.

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

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

Htmlentities в Javascript

В JavaScript нет встроенной точной копии htmlentities, но для похожих целей используют textContent при вставке в DOM или создают элемент и устанавливают текст.

// Пример с textContent
document.getElementById('output').textContent = userInput;

// Или с использованием функции
function escapeHtml(text) {
  const div = document.createElement('div');
  div.textContent = text;
  return div.innerHTML;
}

Htmlentities в Python

В Python для этого применяют функцию html.escape() из модуля html.

import html
text = '<script>alert(\"x\")</script>'
escaped = html.escape(text, quote=True)
print(escaped)  # &lt;script&gt;alert(&quot;x&quot;)&lt;/script&gt;

Htmlentities в MySQL

В MySQL прямой аналогии нет. Для безопасной вставки данных в HTML используется экранирование на уровне языка приложения (например, через PHP). Функции типа QUOTE предназначены для SQL-синтаксиса.

Типичные ошибки
Неправильная кодировка
<?php
// Если строка в кодировке Windows-1251, а указана UTF-8
$str = mb_convert_encoding("Привет", 'Windows-1251', 'UTF-8');
echo htmlentities($str, ENT_QUOTES, 'UTF-8'); // Может вывести некорректно
?>
�������� (или пустой вывод с ENT_SUBSTITUTE)
Двойное экранирование
<?php
$str = '&amp;';
echo htmlentities($str); // По умолчанию $double_encode = true
?>
&amp;amp;
Использование для атрибутов без ENT_QUOTES
<?php
$attr = '" onmouseover="alert(1)';
$html = '<input value="' . htmlentities($attr, ENT_COMPAT) . '">';
echo $html;
?>
<input value="&quot; onmouseover=&quot;alert(1)"> // Уязвимость осталась
Изменения в последних версиях PHP
  • В PHP 8.1 поведение функции htmlentities() и htmlspecialchars() было изменено: по умолчанию они теперь заменяют недопустимые символы кодовой единицы UTF-8 символом замены Unicode U+FFFD (или �) при использовании флага ENT_SUBSTITUTE. Ранее они возвращали пустую строку.
  • В PHP 8.0 параметр $encoding стал необязательным (nullable), значение по умолчанию – null.
  • Начиная с PHP 5.4, кодировка по умолчанию изменилась с ISO-8859-1 на UTF-8.
Расширенные и нестандартные примеры
Работа с разными типами документов
Пример php
<?php
$str = '<tag> "цитата" &';
// Для HTML5
echo htmlentities($str, ENT_QUOTES | ENT_HTML5, 'UTF-8') . "\n";
// Для XML
echo htmlentities($str, ENT_QUOTES | ENT_XML1, 'UTF-8');
?>
&lt;tag&gt; &quot;цитата&quot; &amp;
&lt;tag&gt; &quot;цитата&quot; &amp;
Сохранение существующих сущностей
Пример php
<?php
$str = '&lt;div&gt; уже экранировано &amp;';
echo htmlentities($str, ENT_QUOTES, 'UTF-8', false);
?>
&lt;div&gt; уже экранировано &amp;
Обработка строки с JSON для вставки в JavaScript
Пример php
<?php
$data = ['message' => "<script>alert('test')</script>"];
$json = json_encode($data);
?>
<script>
var data = <?php echo htmlentities($json, ENT_QUOTES, 'UTF-8'); ?>;
</script>
<script>
var data = {"message":"&lt;script&gt;alert('test')&lt;/script&gt;"};
</script>
Использование ENT_DISALLOWED
Пример php
<?php
// Символ, недопустимый в HTML 4.01 (например, управляющий символ)
$str = "Привет\x00 мир";
echo htmlentities($str, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8');
?>
Привет� мир

PHP htmlentities function comments

En
Htmlentities Convert all applicable characters to HTML entities