(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)
html_entity_decode — Преобразовывает HTML-сущности в символы
$string, int $flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401, ? string $encoding = null ): string
Функция html_entity_decode() выполняет преобразование
обратное функции htmlentities() , разница в том, что эта функция
наоборот — преобразовывает HTML-сущности в строке string в символы.
Точнее, эта функция декодирует сущности (включая числовые), которые а) допускает тип документа — то есть, для XML-документов функция не декодирует именованные сущности, которые определяет схема DTD и б) символ или символы которых входят в кодированный набор символов, который связан с выбранной кодировкой, и которые разрешает выбранный тип документа. Остальные сущности функция не изменяет.
stringВходная строка.
flags
Битовая маска из следующих флагов, которые определяют, как обрабатывать кавычки
и какой тип документа использовать.
Маска по умолчанию: ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401.
| Имя константы | Описание |
|---|---|
ENT_COMPAT |
Преобразовывает двойные кавычки, одинарные кавычки не изменяются. |
ENT_QUOTES |
Преобразовывает как двойные, так и одинарные кавычки. |
ENT_NOQUOTES |
Оставляет без изменения как двойные, так и одинарные кавычки. |
ENT_SUBSTITUTE |
Заменяет неправильные последовательности кодовых единиц символом замены Юникода вместо возврата пустой строки: U+FFFD для строк в кодировке UTF-8 и &#FFFD; для строк в других кодировках. |
ENT_HTML401 |
Обрабатывает код в соответствии со стандартом HTML 4.01. |
ENT_XML1 |
Обрабатывает код по правилам стандарта XML 1. |
ENT_XHTML |
Обрабатывает код по правилам стандарта XHTML. |
ENT_HTML5 |
Обрабатывает код по правилам стандарта HTML 5. |
encodingНеобязательный аргумент, который определяет кодировку для преобразования символов.
Функция примет за значение по умолчанию для параметра encoding
значение опции конфигурации default_charset,
если параметр опустили.
Хотя технически этот аргумент необязателен, настоятельно рекомендуется указать правильное значение для кода, на случай если значение опции default_charset окажется неправильным для входных данных.
Функция поддерживает следующие кодировки:
| Кодировка | Псевдонимы | Описание |
|---|---|---|
| ISO-8859-1 | ISO8859-1 | Западно-Европейская кодировка с набором символов Latin-1. |
| ISO-8859-5 | ISO8859-5 | Кириллическая кодировка с набором символов Latin/Cyrillic; применяют редко. |
| ISO-8859-15 | ISO8859-15 | Западно-Европейская кодировка с набором символов Latin-9. Добавляет к набору символов Latin-1 кодировки ISO-8859-1 знак евро, французские и финские буквы. |
| UTF-8 | ASCII-совместимая многобайтовая 8-битная кодировка Unicode. | |
| cp866 | ibm866, 866 | Кириллическая кодировка, которую применяют в семействе операционных систем DOS. |
| cp1251 | Windows-1251, win-1251, 1251 | Кириллическая кодировка, которую применяют в операционных системах Windows. |
| cp1252 | Windows-1252, 1252 | Западно-Европейская кодировка, которую применяют в операционных системах Windows. |
| KOI8-R | koi8-ru, koi8r | Русская кодировка. |
| BIG5 | 950 | Кодировка с набором символов Traditional Chinese (Традиционный китайский), которую применяют в основном на Тайване. |
| GB2312 | 936 | Стандартная национальная кодировка с набором символов Simplified Chinese (Упрощённый китайский). |
| BIG5-HKSCS | Кодировка Big5 с расширениями для Гонконга с набором символов Traditional Chinese (Традиционный китайский). | |
| Shift_JIS | SJIS, SJIS-win, cp932, 932 | Японская кодировка. |
| EUC-JP | EUCJP, eucJP-win | Японская кодировка. |
| MacRoman | Кодировка, которую использовала операционная система Mac OS. | |
'' |
Пустая строка активирует режим определения кодировки из файла скрипта (Zend multibyte), директивы default_charset и текущей локали (смотрите описание функций nl_langinfo() и setlocale() ), в перечисленном порядке. Не рекомендуется использовать. |
Замечание:
Другие кодировки функция не распознаёт. Вместо других кодировок функция будет использовать кодировку по умолчанию и выдаст предупреждение.
Функция возвращает декодированную строку.
| Версия | Описание |
|---|---|
| 8.1.0 |
Значение по умолчанию для параметра flags
изменили с ENT_COMPAT
на ENT_QUOTES | ENT_SUBSTITUTE
| ENT_HTML401 .
|
| 8.0.0 |
Параметр encoding теперь принимает значение null.
|
Пример #1 Пример декодирования HTML-сущностей
<?php
$orig = "I'll \"walk\" the <b>dog</b> now";
$a = htmlentities($orig);
$b = html_entity_decode($a);
echo $a, PHP_EOL; // I'll "walk" the <b>dog</b> now
echo $b, PHP_EOL; // I'll "walk" the <b>dog</b> now
?>Замечание:
Кажется странным, что результатом вызова функции trim(html_entity_decode(' ')); не становится пустая строка. Причина состоит в том, что сущность « » преобразовывается не в символ с ASCII-кодом 32, который функция trim() удаляет, а в символ с ASCII-кодом 160 (0xa0) в принимаемой по умолчанию кодировке ISO-8859-1.
If you need something that converts &#[0-9]+ entities to UTF-8, this is simple and works:
<?php
/* Entity crap. /
$input = "Fovič";
$output = preg_replace_callback("/(&#[0-9]+;)/", function($m) { return mb_convert_encoding($m[1], "UTF-8", "HTML-ENTITIES"); }, $input);
/* Plain UTF-8. */
echo $output;
?>Use the following to decode all entities:
<?php html_entity_decode($string, ENT_QUOTES | ENT_XML1, 'UTF-8') ?>
I've checked these special entities:
- double quotes (")
- single quotes (' and ')
- non printable chars (e.g. )
With other $flags some or all won't be decoded.
It seems that ENT_XML1 and ENT_XHTML are identical when decoding.This functionality is now implemented in the PEAR package PHP_Compat.
More information about using this function without upgrading your version of PHP can be found on the below link:
http://pear.php.net/package/PHP_Compat The following function decodes named and numeric HTML entities and works on UTF-8. Requires iconv.
function decodeHtmlEnt($str) {
$ret = html_entity_decode($str, ENT_COMPAT, 'UTF-8');
$p2 = -1;
for(;;) {
$p = strpos($ret, '&#', $p2+1);
if ($p === FALSE)
break;
$p2 = strpos($ret, ';', $p);
if ($p2 === FALSE)
break;
if (substr($ret, $p+2, 1) == 'x')
$char = hexdec(substr($ret, $p+3, $p2-$p-3));
else
$char = intval(substr($ret, $p+2, $p2-$p-2));
//echo "$char\n";
$newchar = iconv(
'UCS-4', 'UTF-8',
chr(($char>>24)&0xFF).chr(($char>>16)&0xFF).chr(($char>>8)&0xFF).chr($char&0xFF)
);
//echo "$newchar<$p<$p2<<\n";
$ret = substr_replace($ret, $newchar, $p, 1+$p2-$p);
$p2 = $p + strlen($newchar);
}
return $ret;
}I wanted to use this function today and I found the documentation, especially about the flags, not particularly helpful.
Running the code below, for example, failed because the flag I used was the wrong one...
$string = 'Donna's Bakery';
$title = html_entity_decode($string, ENT_HTML401, 'UTF-8');
echo $title;
The correct flag to use in this case is ENT_QUOTES.
My understanding of the flag to use is the one that would correspond to the expected, converted outcome. So, ENT_QUOTES for a character that would be a single or double quote when converted... and so on.
Please help make the documentation a bit clearer.