|
|
 |
html_entity_decode (PHP 4 >= 4.3.0, PHP 5) html_entity_decode --
Convertir todas las entidades HTML a sus caracteres
correspondientes
Descripciónstring html_entity_decode ( string cadena [, int estilo_comillas [, string juego_caracteres]] )
html_entity_decode() es el opuesto
de htmlentities() en el sentido en que
convierte todas las entidades HTML a sus caracteres
correspondientes en la cadena dada.
El segundo parámetro
opcional estilo_comillas le permite
definir lo que debe hacerse con las comillas 'sencillas' y
"dobles". Recibe una de tres constantes posibles, siendo el valor
por defecto ENT_COMPAT:
Tabla 1. Constantes disponibles
para estilo_comillas | Nombre de constante | Descripción |
|---|
| ENT_COMPAT | Convierte las comillas dobles y deja intactas las
comillas sencillas. | | ENT_QUOTES | Convierte tanto comillas dobles como sencillas. | | ENT_NOQUOTES | No convierte ni las comillas dobles ni las
sencillas. |
El juego de caracteres ISO-8859-1 es usado como valor
predeterminado para el tercer argumento
opcional juego_caracteres. Éste
define el juego de caracteres usado en la conversión.
Los siguientes juegos de caracteres son soportados a partir de PHP
4.3.0.
Tabla 2. Juegos de caracteres soportados | Juego de caracteres | Aliases | Descripción |
|---|
| ISO-8859-1 | ISO8859-1 |
Europeo Occidental, Latin-1
| | ISO-8859-15 | ISO8859-15 |
Europeo Occidental, Latin-9. Añade el signo de Euro, y
letras del Francés y Finlandés que hacÃan
falta en Latin-1(ISO-8859-1).
| | UTF-8 | |
Multi-byte Unicode de 8-bits compatible con ASCII.
| | cp866 | ibm866, 866 |
Juego de caracteres cirÃlicos especÃfico de DOS. Este
juego de caracteres está soportado en 4.3.2.
| | cp1251 | Windows-1251, win-1251, 1251 |
Juego de caracteres cirÃlicos especÃfico de Windows. Este
juego de caracteres está soportado en 4.3.2.
| | cp1252 | Windows-1252, 1252 |
Juego de caracteres especÃfico de Windows para Europa
Occidental.
| | KOI8-R | koi8-ru, koi8r |
Ruso. Este juego de caracteres está soportado en 4.3.2.
| | 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, 932 |
Japonés
| | EUC-JP | EUCJP |
Japonés
|
Nota:
Cualquier otro juego de caracteres no es reconocido y en su lugar se
utilizará ISO-8859-1.
Nota:
Esta función no soporta conjuntos de caracteres
multi-bytes en PHP < 5.
Ejemplo 1. Decodificación de entidades HTML |
<?php
$orig = "I'll \"walk\" the <b>dog</b> now";
$a = htmlentities($orig);
$b = html_entity_decode($a);
echo $a; echo $b; function unhtmlentities($cadena)
{
$cadena = preg_replace('~&#x([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $cadena);
$cadena = preg_replace('~&#([0-9]+);~e', 'chr(\\1)', $cadena);
$trans_tbl = get_html_translation_table(HTML_ENTITIES);
$trans_tbl = array_flip($trans_tbl);
return strtr($cadena, $trans_tbl);
}
$c = unhtmlentities($a);
echo $c; ?>
|
|
Nota:
Puede que se pregunte por qué
trim(html_entity_decode(' ')); no reduce la cadena a
una cadena vacÃa, esto es porque la entidad ' '
no es el código ASCII 32 (el cual es eliminado
por trim()) sino el código ASCII 160
(0xa0) en el juego de caracteres por defecto, ISO 8859-1.
Vea también
htmlentities(),
htmlspecialchars(),
get_html_translation_table(),
y urldecode().
add a note
User Contributed Notes
html_entity_decode
derernst at gmx dot ch
01-Aug-2006 03:09
Combining the suggestions by buraks78 at gmail dot com, gaui at gaui dot is, daniel at brightbyte dot de, and the version in PEAR_PHP_Compat, I come to the following, which should work in an UTF-8 environment, with PHP < or > 4.3:
<?php
function decode_entities($text, $quote_style = ENT_COMPAT) {
if (function_exists('html_entity_decode')) {
$text = html_entity_decode($text, $quote_style, 'ISO-8859-1'); }
else {
$trans_tbl = get_html_translation_table(HTML_ENTITIES, $quote_style);
$trans_tbl = array_flip($trans_tbl);
$text = strtr($text, $trans_tbl);
}
$text = preg_replace('~&#x([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $text);
$text = preg_replace('~&#([0-9]+);~e', 'chr("\\1")', $text);
return $text;
}
?>
Note that I omitted the line
$trans_table['''] = "'";
as it would override the quote_style setting and thus lead to unexpected results for quote_styles ENT_NOQUOTES and ENT_COMPAT.
grvg (at) free (dot) fr
29-Jul-2006 09:44
Here is the ultimate functions to convert HTML entities to UTF-8Â :
The main function is htmlentities2utf8
Others are helper functions
function chr_utf8($code)
{
if ($code < 0) return false;
elseif ($code < 128) return chr($code);
elseif ($code < 160) // Remove Windows Illegals Cars
{
if ($code==128) $code=8364;
elseif ($code==129) $code=160; // not affected
elseif ($code==130) $code=8218;
elseif ($code==131) $code=402;
elseif ($code==132) $code=8222;
elseif ($code==133) $code=8230;
elseif ($code==134) $code=8224;
elseif ($code==135) $code=8225;
elseif ($code==136) $code=710;
elseif ($code==137) $code=8240;
elseif ($code==138) $code=352;
elseif ($code==139) $code=8249;
elseif ($code==140) $code=338;
elseif ($code==141) $code=160; // not affected
elseif ($code==142) $code=381;
elseif ($code==143) $code=160; // not affected
elseif ($code==144) $code=160; // not affected
elseif ($code==145) $code=8216;
elseif ($code==146) $code=8217;
elseif ($code==147) $code=8220;
elseif ($code==148) $code=8221;
elseif ($code==149) $code=8226;
elseif ($code==150) $code=8211;
elseif ($code==151) $code=8212;
elseif ($code==152) $code=732;
elseif ($code==153) $code=8482;
elseif ($code==154) $code=353;
elseif ($code==155) $code=8250;
elseif ($code==156) $code=339;
elseif ($code==157) $code=160; // not affected
elseif ($code==158) $code=382;
elseif ($code==159) $code=376;
}
if ($code < 2048) return chr(192 | ($code >> 6)) . chr(128 | ($code & 63));
elseif ($code < 65536) return chr(224 | ($code >> 12)) . chr(128 | (($code >> 6) & 63)) . chr(128 | ($code & 63));
else return chr(240 | ($code >> 18)) . chr(128 | (($code >> 12) & 63)) . chr(128 | (($code >> 6) & 63)) . chr(128 | ($code & 63));
}
// Callback for preg_replace_callback('~&(#(x?))?([^;]+);~', 'html_entity_replace', $str);
function html_entity_replace($matches)
{
if ($matches[2])
{
return chr_utf8(hexdec($matches[3]));
} elseif ($matches[1])
{
return chr_utf8($matches[3]);
}
switch ($matches[3])
{
case "nbsp": return chr_utf8(160);
case "iexcl": return chr_utf8(161);
case "cent": return chr_utf8(162);
case "pound": return chr_utf8(163);
case "curren": return chr_utf8(164);
case "yen": return chr_utf8(165);
//... etc with all named HTML entities
}
return false;
}
function htmlentities2utf8 ($string) // because of the html_entity_decode() bug with UTF-8
{
$string = preg_replace_callback('~&(#(x?))?([^;]+);~', 'html_entity_replace', $string);
return $string;
}
nycolhas at hotmail dot com
05-Apr-2006 11:24
This function might be useful for people who want to capitalize a string using html entities.
<?php
function htmlstrtoupper(&$string) {
return htmlentities(strtoupper(html_entity_decode(&$string)));
}
?>
buraks78 at gmail dot com
07-Feb-2006 03:19
The "unhtmlentities" function defined above fails to decode single quotes properly. The issue can be solved by putting double quotes around replacing chr(\\1) with chr("\\1")...
function unhtmlentities($string)
{
// replace numeric entities
$string = preg_replace('~&#x([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $string);
$string = preg_replace('~&#([0-9]+);~e', 'chr("\\1")', $string);
// replace literal entities
$trans_tbl = get_html_translation_table(HTML_ENTITIES);
$trans_tbl = array_flip($trans_tbl);
return strtr($string, $trans_tbl);
}
hurricane at cyberworldz dot org
22-Dec-2005 08:33
I shortened the function repace_num_entity a bit to make more understandable and clean. Maybe now someone sees the problem it possibly has... (as mentioned below)
<?php
function replace_num_entity($ord) {
$ord = $ord[1];
if (preg_match('/^x([0-9a-f]+)$/i', $ord, $match)) $ord = hexdec($match[1]);
else $ord = intval($ord);
$no_bytes = 0;
$byte = array();
if ($ord < 128) return chr($ord);
if ($ord < 2048) $no_bytes = 2;
else if ($ord < 65536) $no_bytes = 3;
else if ($ord < 1114112) $no_bytes = 4;
else return;
switch($no_bytes) {
case 2: $prefix = array(31, 192); break;
case 3: $prefix = array(15, 224); break;
case 4: $prefix = array(7, 240);
}
for ($i=0; $i < $no_bytes; ++$i)
$byte[$no_bytes-$i-1] = (($ord & (63 * pow(2,6*$i))) / pow(2,6*$i)) & 63 | 128;
$byte[0] = ($byte[0] & $prefix[0]) | $prefix[1];
$ret = '';
for ($i=0; $i < $no_bytes; ++$i) $ret .= chr($byte[$i]);
return $ret;
}
?>
loufoque
08-Oct-2005 01:15
If you want to decode NCRs to utf-8 use this function instead of chr().
function utf8_chr($code)
{
if($code<128) return chr($code);
else if($code<2048) return chr(($code>>6)+192).chr(($code&63)+128);
else if($code<65536) return chr(($code>>12)+224).chr((($code>>6)&63)+128).chr(($code&63)+128);
else if($code<2097152) return chr($code>>18+240).chr((($code>>12)&63)+128)
.chr(($code>>6)&63+128).chr($code&63+128));
}
emilianomartinezluque at yahoo dot com
25-Sep-2005 05:22
I've been using the great replace_num_entity function posted below. But there seems to be some problems with the 128 to 160 characters range. Ie, try:
<?php header("Content-type: text/html; charset=utf-8"); ?>
<html><body>
<?php
for($x=128; $x<161; $x++) {
echo('&#' . $x . '; -- ' . preg_replace_callback('/&#([0-9a-fx]+);/mi', 'replace_num_entity', '&#' . $x . ';') . '</br>');
}
?>
</body></html>
I really don´t know the reason for this (since according to UTF-8 specs the function should have worked) but I did a modified version of the function to address this. Hope it helps.
function replace_num_entity($ord)
{
$ord = $ord[1];
if (preg_match('/^x([0-9a-f]+)$/i', $ord, $match))
{
$ord = hexdec($match[1]);
}
else
{
$ord = intval($ord);
}
$no_bytes = 0;
$byte = array();
if($ord == 128) {
return chr(226).chr(130).chr(172);
} elseif($ord == 129) {
return chr(239).chr(191).chr(189);
} elseif($ord == 130) {
return chr(226).chr(128).chr(154);
} elseif($ord == 131) {
return chr(198).chr(146);
} elseif($ord == 132) {
return chr(226).chr(128).chr(158);
} elseif($ord == 133) {
return chr(226).chr(128).chr(166);
} elseif($ord == 134) {
return chr(226).chr(128).chr(160);
} elseif($ord == 135) {
return chr(226).chr(128).chr(161);
} elseif($ord == 136) {
return chr(203).chr(134);
} elseif($ord == 137) {
return chr(226).chr(128).chr(176);
} elseif($ord == 138) {
return chr(197).chr(160);
} elseif($ord == 139) {
return chr(226).chr(128).chr(185);
} elseif($ord == 140) {
return chr(197).chr(146);
} elseif($ord == 141) {
return chr(239).chr(191).chr(189);
} elseif($ord == 142) {
return chr(197).chr(189);
} elseif($ord == 143) {
return chr(239).chr(191).chr(189);
} elseif($ord == 144) {
return chr(239).chr(191).chr(189);
} elseif($ord == 145) {
return chr(226).chr(128).chr(152);
} elseif($ord == 146) {
return chr(226).chr(128).chr(153);
} elseif($ord == 147) {
return chr(226).chr(128).chr(156);
} elseif($ord == 148) {
return chr(226).chr(128).chr(157);
} elseif($ord == 149) {
return chr(226).chr(128).chr(162);
} elseif($ord == 150) {
return chr(226).chr(128).chr(147);
} elseif($ord == 151) {
return chr(226).chr(128).chr(148);
} elseif($ord == 152) {
return chr(203).chr(156);
} elseif($ord == 153) {
return chr(226).chr(132).chr(162);
} elseif($ord == 154) {
return chr(197).chr(161);
} elseif($ord == 155) {
return chr(226).chr(128).chr(186);
} elseif($ord == 156) {
return chr(197).chr(147);
} elseif($ord == 157) {
return chr(239).chr(191).chr(189);
} elseif($ord == 158) {
return chr(197).chr(190);
} elseif($ord == 159) {
return chr(197).chr(184);
} elseif($ord == 160) {
return chr(194).chr(160);
}
if ($ord < 128)
{
return chr($ord);
}
elseif ($ord < 2048)
{
$no_bytes = 2;
}
elseif ($ord < 65536)
{
$no_bytes = 3;
}
elseif ($ord < 1114112)
{
$no_bytes = 4;
}
else
{
return;
}
switch($no_bytes)
{
case 2:
{
$prefix = array(31, 192);
break;
}
case 3:
{
$prefix = array(15, 224);
break;
}
case 4:
{
$prefix = array(7, 240);
}
}
for ($i = 0; $i < $no_bytes; $i++)
{
$byte[$no_bytes - $i - 1] = (($ord & (63 * pow(2, 6 * $i))) / pow(2, 6 * $i)) & 63 | 128;
}
$byte[0] = ($byte[0] & $prefix[0]) | $prefix[1];
$ret = '';
for ($i = 0; $i < $no_bytes; $i++)
{
$ret .= chr($byte[$i]);
}
return $ret;
}
florianborn (at) yahoo (dot) de
20-Jul-2005 03:43
Note that
<?php
echo urlencode(html_entity_decode(" "));
?>
will output "%A0" instead of "+".
gaui at gaui dot is
04-Jul-2005 05:15
if( !function_exists( 'html_entity_decode' ) )
{
function html_entity_decode( $given_html, $quote_style = ENT_QUOTES ) {
$trans_table = array_flip(get_html_translation_table( HTML_SPECIALCHARS, $quote_style ));
$trans_table['''] = "'";
return ( strtr( $given_html, $trans_table ) );
}
}
marius (at) hot (dot) ee
08-Apr-2005 06:40
To convert html entities into unicode characters, use the following:
$trans_tbl = get_html_translation_table(HTML_ENTITIES);
foreach($trans_tbl as $k => $v)
{
$ttr[$v] = utf8_encode($k);
}
$text = strtr($text, $ttr);
php dot net at c dash ovidiu dot tk
18-Mar-2005 12:37
Quick & dirty code that translates numeric entities to UTF-8.
<?php
function replace_num_entity($ord)
{
$ord = $ord[1];
if (preg_match('/^x([0-9a-f]+)$/i', $ord, $match))
{
$ord = hexdec($match[1]);
}
else
{
$ord = intval($ord);
}
$no_bytes = 0;
$byte = array();
if ($ord < 128)
{
return chr($ord);
}
elseif ($ord < 2048)
{
$no_bytes = 2;
}
elseif ($ord < 65536)
{
$no_bytes = 3;
}
elseif ($ord < 1114112)
{
$no_bytes = 4;
}
else
{
return;
}
switch($no_bytes)
{
case 2:
{
$prefix = array(31, 192);
break;
}
case 3:
{
$prefix = array(15, 224);
break;
}
case 4:
{
$prefix = array(7, 240);
}
}
for ($i = 0; $i < $no_bytes; $i++)
{
$byte[$no_bytes - $i - 1] = (($ord & (63 * pow(2, 6 * $i))) / pow(2, 6 * $i)) & 63 | 128;
}
$byte[0] = ($byte[0] & $prefix[0]) | $prefix[1];
$ret = '';
for ($i = 0; $i < $no_bytes; $i++)
{
$ret .= chr($byte[$i]);
}
return $ret;
}
$test = 'This is a čא test'';
echo $test . "<br />\n";
echo preg_replace_callback('/&#([0-9a-fx]+);/mi', 'replace_num_entity', $test);
?>
Silvan
28-Jan-2005 07:33
Passing NULL or FALSE as a string will generate a '500 Internal Server Error' (or break the script when inside a function).
So always test your string first before passing it to html_entity_decode().
daniel at brightbyte dot de
13-Nov-2004 06:12
This function seems to have to have two limitations (at least in PHP 4.3.8):
a) it does not work with multibyte character codings, such as UTF-8
b) it does not decode numeric entity references
a) can be solved by using iconv to convert to ISO-8859-1, then decoding the entities, than convert to UTF-8 again. But that's quite ugly and detroys all characters not present in Latin-1.
b) can be solved rather nicely using the following code:
<?php
function decode_entities($text) {
$text= html_entity_decode($text,ENT_QUOTES,"ISO-8859-1"); $text= preg_replace('/&#(\d+);/me',"chr(\\1)",$text); $text= preg_replace('/&#x([a-f0-9]+);/mei',"chr(0x\\1)",$text); return $text;
}
?>
HTH
| |
| | Citas célebres | Ir a la ópera, como emborracharse, es un pecado que lleva incluida su propia penitencia, y es una penitencia muy dura. Hannah More Escritora británica (1745-1833) | | Citas en tu mail | | ©Contenidos Gratis |
| Chiste de... Transportes | | Gracias a Dios | Esto es un conductor de camiones que transporta 75 toneladas de nitroglicerina y justo en lo más alto de un collado se da cuenta de que no tiene frenos y empieza a bajar cada vez mas rápido. El camión va derrapando como si fuese una moto, esquivando como puede a los coches que vienen en dirección contraria.
Va trotando todo el rato, porque el firme de la carretera esta lleno de baches, y de vez en cuando choca ligeramente con el muro que hay al lado de la carretera. El conductor intenta en vano encontrar algun desvío, y al final el camión se sale de la carretera por una curva que da a un precipio profundísimo.
El desgraciado conductor intenta quitarse el cinturón de seguridad, pero se ha atascado; mientras el camión va cayendo, se las apaña para cortarlo con una navaja que se le escurre entre los dedos varias veces, porque los tiene llenos de sudor.
Intenta abrir la puerta, pero en uno de los choques contra el muro se ha deformado y es imposible moverla, así que coge el extintor y empieza a golpear el parabrisas; como es de cristal superesistente le cuesta mucho, pero al final consigue romperlo y salta.
Sin embargo, se engancha con los vaqueros en uno de los hierros; intenta soltarse, pero es imposible, así que se los quita y por fin sale del camión.
A pesar de que no ve nada, porque ha perdido las gafas, consigue agarrarse a una ramita. En ese momento, el camión explota con tanta violencia que a su alrededor cae una lluvia de fragmentos ardiendo y se produce una avalancha encima suyo.
El hombre aguanta como puede los golpes de las piedras en la cabeza, pero la ramita es demasiado pequeña y se desprende. El camionero baja rodando por el barranco, golpeándose con todas las piedras, casi pierde el conocimiento, hasta que consigue agarrarse a un cardo borriquero y cree estar a salvo; sin embargo, debajo de esa rama hay una colmena.
Nuestro hombre es alérgico al veneno de las abejas, pero como no puede soltarse porque la caída sería mortal, aguanta impasible sus picaduras. Transcurre un rato que le parece una eternidad hasta que oye unos gritos; le dicen que le han visto y que van a llamar a la Guardia Civil.
No hay ningun teléfono cerca, así que tienen que ir hasta el pueblo mas cercano, a 20 kilómetros de distancia; un atasco impide que la ayuda llegue pronto, y cuando llega la Guardia Civil se dan cuenta de que van a necesitar cuerdas para llegar hasta el fondo para rescatarle, y vuelven a por ellas.
El camionero aguanta varias horas bajo el sol ardiente, que le produce quemaduras de tercer grado, pero al final es rescatado. Entonces uno de sus salvadores le dice:
- Gracias a Dios se ha salvado.
- No, gracias a Dios no, me he salvado gracias a ese cardo, porque las intenciones de Dios estaban bien claras. | | Chistes en tu mail | | ©ContenidosGratis |
| Inicio | Acción | Estrategia | Palabras | Puzzles | Solitarios | Foro Trucos |  | Cake Mania Jugadores: 6835 Categoría del juego: Acción Objetivo del juego: Ayuda a Jill a recuperar la pastelería de su abuela llevando su propia pastelería; consigue clientes y gana dinero. |
|  | Rainbow Web Jugadores: 2199 Categoría del juego: Puzzles Objetivo del juego: Rompe un pegajoso hechizo y salva un reino de fantasía en Rainbow Web. Tendrás toneladas de diversión mientras juegas a este mágico desafío para la mente. |
|  | Mahjongg Fortuna Jugadores: 12462 Categoría del juego: Solitarios Objetivo del juego: Velocidad y habilidad mental son las armas más importantes en esta versión de un antiguo juego asiático. Despeja el tablero lo antes posible haciendo clic en las fichas iguales y gánate la fama eterna de la puntuación más alta. |
|  | Chainz 2 Jugadores: 6955 Categoría del juego: Puzzles Objetivo del juego: Entra en el mundo de las combinaciones con Chainz 2: Relinked, emocionante secuela del exitazo del año pasado, Chainz. Gira eslabones y crea combinaciones de 3 ó más. |
|  | Delicious Jugadores: 4405 Categoría del juego: Acción Objetivo del juego: ¿Eres un as de la multitarea? ¿Quieres que tus clientes estén contentos? ¡Pues Delicious es tu juego! Sacia el apetito de los clientes y tenlos contentos; ¡no te arriesgues! |
|  | Bookworm Jugadores: 4568 Categoría del juego: Palabras Objetivo del juego: Junta las letras para formar palabras. ¡Las palabras más largas valen más puntos! |
|  | Zuma Jugadores: 4976 Categoría del juego: Acción Objetivo del juego: Controla el ídolo de la rana de piedra de los antiguos Zuma en este intrigante enigma de acción. ¡Dispara bolas para formar conjuntos de tres, pero si dejas que lleguen a la calavera dorada morirás! |
|  | Jewel of Atlantis Jugadores: 3798 Categoría del juego: Puzzles Objetivo del juego: Descubre la ciudad hundida de la Atlántida y busca valiosos tesoros. Viaja más allá de las profundidades del mar y vive trepidantes aventuras en Jewel of Atlantis. |
|  | Jewel Quest Jugadores: 3727 Categoría del juego: Puzzles Objetivo del juego: Convierte la arena de la antigua selva en oro tan rápido como puedas juntando grupos de 3 elementos. ¡Los grupos más grandes valen más puntos! |
|  | Bejeweled 2 Jugadores: 3659 Categoría del juego: Puzzles Objetivo del juego: Con cuatro modos de juego únicos y fascinantes, nuevas piezas de juego explosivas e imponentes fondos planetarios, Bejeweled 2 es mucho más adictivo que nunca. |
|
|