W3docs

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
): string

Devuelve una nueva cadena con los caracteres aplicables convertidos; la cadena original nunca se modifica.

ParámetroRequeridoDescripción
$stringLa cadena de entrada a codificar.
$flagsNoCómo se manejan las comillas y qué tipo de documento se usa. Consulta los flags a continuación.
$encodingNoEl juego de caracteres de la entrada (p. ej. "UTF-8"). Por defecto usa la configuración ini default_charset.
$double_encodeNoCuando 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 era ENT_COMPAT | ENT_HTML401, que no codifica las comillas simples. Si necesitas compatibilidad con versiones anteriores, pasa ENT_QUOTES explícitamente.

Uso básico

php— editable, runs on the server

Esto genera como salida:

Hello &lt;strong&gt;World&lt;/strong&gt;!

Los caracteres < y > ahora son &lt; y &gt;, 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:

FlagComillas simples (')Comillas dobles (")
ENT_QUOTESCodificadasCodificadas
ENT_COMPATSin cambiosCodificadas
ENT_NOQUOTESSin cambiosSin 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.

php— editable, runs on the server

Salida:

I&#039;m a paragraph

La comilla simple se convierte en &#039;. 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.

php— editable, runs on the server

Salida:

Caf&eacute; &amp; &laquo;&uuml;ber&raquo;

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 &lt; se convierte en &amp;lt;. Pasa false para dejar las entidades ya codificadas sin modificar — útil cuando parte de tu cadena está intencionalmente pre-escapada.

php— editable, runs on the server

Con $double_encode establecido en false, las entidades existentes pasan sin cambios:

Hello &lt;strong&gt;World&lt;/strong&gt;!

Si hubieras dejado $double_encode en su valor predeterminado true, cada & habría sido re-escapado a &amp;, produciendo Hello &amp;lt;strong&amp;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_QUOTES y "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().

Práctica

Práctica
¿Cuál es la función de 'htmlentities' en PHP?
¿Cuál es la función de 'htmlentities' en PHP?
Was this page helpful?