(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)
html_entity_decode — Convierte las entidades HTML a sus caracteres correspondientes
$string, int $flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401, ? string $encoding = null ): string
html_entity_decode() es la función contraria de
htmlentities() : convierte las entidades HTML de
la cadena string a sus caracteres correspondientes.
De manera más explícita, esta función decodifica todas las entidades (incluyendo las entidades numéricas) que 1) son necesariamente válidas para el tipo de documento seleccionado - es decir, para XML, esta función no decodifica las entidades nombradas que pueden estar definidas en una DTD - y 2) cuyo carácter o caracteres están en el juego de caracteres codificado con la codificación elegida y están permitidos en el tipo de documento seleccionado. Todas las demás entidades se dejan tal cual.
stringLa cadena de entrada.
flags
Una máscara de uno o varios flag siguientes, que especifican la forma
en que deben ser gestionadas las comillas y qué tipo de documento debe ser utilizado.
Por omisión, es ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401.
| Constante | Descripción |
|---|---|
ENT_COMPAT |
Convierte las comillas dobles e ignora las comillas simples. |
ENT_QUOTES |
Convierte las comillas dobles y las comillas simples. |
ENT_NOQUOTES |
No convierte ninguna comilla. |
ENT_SUBSTITUTE |
Reemplaza las secuencias de código no válidas con un carácter de reemplazo Unicode U+FFFD (UTF-8) o &#FFFD; (de lo contrario) en lugar de devolver una cadena vacía. |
ENT_HTML401 |
Gestiona el código como HTML 4.01. |
ENT_XML1 |
Gestiona el código como XML 1. |
ENT_XHTML |
Gestiona el código como XHTML. |
ENT_HTML5 |
Gestiona el código como HTML 5. |
encodingUn argumento opcional que define el codificado utilizado durante la conversión de caracteres.
Si se omite, el valor predeterminado del parámetro encoding es el valor de la opción de configuración
default_charset
.
Aunque este argumento es técnicamente opcional, se recomienda encarecidamente especificar el valor correcto para su código si la opción de configuración default_charset ha sido definida incorrectamente para la entrada proporcionada.
Están soportados los siguientes juegos de caracteres:
| Juego de caracteres | Alias | Descripción |
|---|---|---|
| ISO-8859-1 | ISO8859-1 | Europeo occidental, Latin-1. |
| ISO-8859-5 | ISO8859-5 | Juego de caracteres cirílicos poco usado (Latin/Cyrillic). |
| ISO-8859-15 | ISO8859-15 | Europeo occidental, Latin-9. Añade el signo de euro, y letras del francés y finlandés ausentes en Latin-1 (ISO-8859-1). |
| UTF-8 | Unicode de 8 bit multibyte compatible con ASCII. | |
| cp866 | ibm866, 866 | Juego de caracteres cirílico específico de DOS. |
| cp1251 | Windows-1251, win-1251, 1251 | Juego de caracteres cirílico específico de Windows. |
| cp1252 | Windows-1252, 1252 | Juego de caracteres específico de Windows para Europa occidental. |
| KOI8-R | koi8-ru, koi8r | Ruso. |
| BIG5 | 950 | Chino tradicional, usado principalmente en Taiwán. |
| GB2312 | 936 | Chino simplificado, juego de caracteres estándar nacional. |
| BIG5-HKSCS | Big5 con extensiones de Hong Kong, chino tradicional. | |
| Shift_JIS | SJIS, SJIS-win, cp932, 932 | Japonés |
| EUC-JP | EUCJP, eucJP-win | Japonés |
| MacRoman | Juego de caracteres que fue utilizado por Mac OS. | |
'' |
Un string vacío activa la detección desde la codificación del script (Zend multibyte), default_charset y la actual configuración regional (véase nl_langinfo() y setlocale() ), en este orden. No se recomienda. |
Nota:
No se reconoce cualquier otro juego de caracteres. Será utilizada en su lugar la codificación por defecto y se emitirá una advertencia.
Devuelve la cadena decodificada.
| Versión | Descripción |
|---|---|
| 8.1.0 |
flags cambió de ENT_COMPAT a
ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401 .
|
| 8.0.0 |
encoding ahora puede ser nullable.
|
Ejemplo #1 Decodificar entidades HTML
<?php
$orig = 'J\'ai "sorti" le <strong>chien</strong> tout à l\'heure';
$a = htmlentities($orig);
$b = html_entity_decode($a);
echo $a, PHP_EOL; // J'ai "sorti" le <strong>chien</strong> tout &agrave; l'heure
echo $b, PHP_EOL; // J'ai "sorti" le <strong>chien</strong> tout à l'heure
?>Nota:
Podría preguntarse por qué
trim(html_entity_decode(' '));no reduce la cadena a la cadena vacía. Esto se debe a que la entidad no es un código ASCII 32 (que sería eliminado por trim() ), sino un código ASCII 160 (0xa0) en la codificación por omisiónISO 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.