htmlentities()
La función htmlentities() convierte los caracteres especiales en sus entidades HTML correspondientes. La sintaxis de htmlentities() es la siguiente:
La función PHP htmlentities() convierte cada carácter que tiene una entidad HTML con nombre en dicha entidad. Es la herramienta principal para imprimir de forma segura texto no confiable —como la entrada de un usuario en un formulario— dentro de una página HTML, porque transforma los caracteres que el navegador interpretaría como marcado (<, >, &, comillas) en texto visible inofensivo. Esto es lo que la convierte en la primera línea de defensa contra ataques de cross-site scripting (XSS).
Esta página cubre la sintaxis, cada uno de los cuatro parámetros, la diferencia práctica respecto a htmlspecialchars(), y los errores comunes relacionados con la codificación y la doble codificación.
Sintaxis
htmlentities(
string $string,
int $flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401,
?string $encoding = null,
bool $double_encode = true
): stringDevuelve una nueva cadena con los caracteres aplicables convertidos; la cadena original nunca se modifica.
| Parámetro | Requerido | Descripción |
|---|---|---|
$string | Sí | La cadena de entrada a codificar. |
$flags | No | Cómo se manejan las comillas y qué tipo de documento se usa. Consulta los flags a continuación. |
$encoding | No | El juego de caracteres de la entrada (p. ej. "UTF-8"). Por defecto usa la configuración ini default_charset. |
$double_encode | No | Cuando es false, los caracteres que ya forman parte de una entidad existente se dejan sin cambios. |
Nota: A partir de PHP 8.1, los flags predeterminados son
ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401. En PHP 8.0 y versiones anteriores el valor predeterminado eraENT_COMPAT | ENT_HTML401, que no codifica las comillas simples. Si necesitas compatibilidad con versiones anteriores, pasaENT_QUOTESexplícitamente.
Uso básico
Esto genera como salida:
Hello <strong>World</strong>!Los caracteres < y > ahora son < y >, por lo que el navegador los muestra como texto literal en lugar de abrir una etiqueta <strong> real.
El parámetro $flags — manejo de comillas
El segundo parámetro controla cómo se tratan las comillas. Los flags más útiles son:
| Flag | Comillas simples (') | Comillas dobles (") |
|---|---|---|
ENT_QUOTES | Codificadas | Codificadas |
ENT_COMPAT | Sin cambios | Codificadas |
ENT_NOQUOTES | Sin cambios | Sin cambios |
Usa ENT_QUOTES siempre que la salida pueda aparecer dentro de un atributo HTML con comillas simples; de lo contrario, una ' en los datos podría romper el atributo.
Salida:
I'm a paragraphLa comilla simple se convierte en '. Con el valor predeterminado anterior ENT_COMPAT habría permanecido como una ' literal.
El parámetro $encoding
El tercer parámetro indica a htmlentities() qué juego de caracteres usa la entrada, para que pueda mapear correctamente los caracteres multibyte. Establécelo siempre explícitamente en "UTF-8" para aplicaciones modernas — una codificación incorrecta puede corromper silenciosamente la salida o, en versiones antiguas de PHP, devolver una cadena vacía.
Salida:
Café & «über»Observa cómo é, «, ü y » se convierten cada uno en sus entidades con nombre — este es el comportamiento que distingue a htmlentities() de htmlspecialchars(), que dejaría esos caracteres acentuados sin modificar.
El parámetro $double_encode
Por defecto (true), htmlentities() vuelve a codificar el & de una entidad existente, de modo que < se convierte en &lt;. Pasa false para dejar las entidades ya codificadas sin modificar — útil cuando parte de tu cadena está intencionalmente pre-escapada.
Con $double_encode establecido en false, las entidades existentes pasan sin cambios:
Hello <strong>World</strong>!Si hubieras dejado $double_encode en su valor predeterminado true, cada & habría sido re-escapado a &, produciendo Hello &lt;strong&gt;....
htmlentities() vs htmlspecialchars()
Este es el punto de confusión más común:
htmlspecialchars()convierte únicamente los cinco caracteres que tienen significado especial en HTML:&,<,>,"y'.htmlentities()convierte esos más todos los demás caracteres que tienen una entidad con nombre (letras acentuadas, símbolos, signos de moneda, etc.).
Para escapar la salida de forma segura, htmlspecialchars() suele ser la mejor opción: es más pequeña, más rápida y —siempre que emitas una página UTF-8— los caracteres acentuados se muestran correctamente sin necesidad de convertirlos en entidades. Recurre a htmlentities() solo cuando necesites específicamente que se conviertan todos los caracteres mapeables a entidades, por ejemplo al generar contenido para un destino cuyo juego de caracteres no puedes controlar.
Para revertir la conversión, usa html_entity_decode() o htmlspecialchars_decode().
Puntos clave
htmlentities()devuelve una nueva cadena y nunca modifica la original.- Pasa siempre
ENT_QUOTESy"UTF-8"explícitamente para obtener una salida predecible y segura en todas las versiones de PHP. - Es un filtro de salida — escapa los datos cuando los imprimes, no cuando los almacenas.
- Para el escapado HTML típico, prefiere
htmlspecialchars().