¿Cuáles son las diferencias entre htmlspecialchars()
y htmlentities()
. ¿Cuándo debo usar uno u otro?
De la documentación de PHP para htmlentities :
Esta función es idéntica
htmlspecialchars()
en todos los aspectos, excepto conhtmlentities()
, todos los caracteres que tienen equivalentes de entidad de caracteres HTML se traducen en estas entidades.
De la documentación de PHP para htmlspecialchars :
Ciertos caracteres tienen un significado especial en HTML y deben ser representados por entidades HTML para preservar sus significados. Esta función devuelve una cadena con algunas de estas conversiones realizadas; Las traducciones realizadas son las más útiles para la programación web diaria. Si necesita que se traduzcan todas las entidades de caracteres HTML, utilice
htmlentities()
en su lugar.
La diferencia es lo que se codifica. Las opciones son todo (entidades) o caracteres "especiales", como ampersand, comillas dobles y simples, menor que y mayor que (caracteres especiales).
Prefiero usar htmlspecialchars
siempre que sea posible.
Por ejemplo:
echo htmlentities('<Il était une fois un être>.');
// Output: <Il était une fois un être>.
// ^^^^^^^^ ^^^^^^^
echo htmlspecialchars('<Il était une fois un être>.');
// Output: <Il était une fois un être>.
// ^ ^
htmlspecialchars()
siempre que sea posible, aparte de las diferencias obvias? ¿Qué situaciones tehtmlentities()
causarán problemas con el uso yhtmlspecialchars()
no?htmlentities
yhtmlspecialchars
ambos pueden manejar UTF-8 siempre que especifique"UTF-8"
para el tercer argumento.htmlspecialchars
puede ser usado:Cuando no hay necesidad de codificar todos los caracteres que tienen sus equivalentes HTML.
Si sabe que la codificación de la página coincide con los símbolos especiales de texto, ¿por qué usaría
htmlentities
?htmlspecialchars
es mucho más sencillo y produce menos código para enviar al cliente.Por ejemplo:
El segundo es más corto y no causa ningún problema si se establece el juego de caracteres ISO-8859-1.
Cuando los datos se procesarán no solo a través de un navegador (para evitar decodificar entidades HTML),
Si la salida es XML (ver la respuesta de Artefacto ).
fuente
Esto está siendo codificado con
htmlentities
.implode( "\t", array_values( get_html_translation_table( HTML_ENTITIES ) ) )
:Esto está siendo codificado con
htmlspecialchars
.implode( "\t", array_values( get_html_translation_table( HTML_SPECIALCHARS ) ) )
:fuente
Porque:
htmlentities
sustituye a más personajes quehtmlspecialchars
. Esto es innecesario, hace que el script PHP sea menos eficiente y el código HTML resultante sea menos legible.htmlentities
solo es necesario si sus páginas usan codificaciones como ASCII o LATIN-1 en lugar de UTF-8 y está manejando datos con una codificación diferente a la de la página.fuente
Debe usar
htmlspecialchars($strText, ENT_QUOTES)
cuando solo desea que su cadena sea segura para XML y HTML:Por ejemplo, codificar
Sin embargo, si también tiene caracteres adicionales que son símbolos Unicode o poco comunes en su texto, entonces debe usar htmlentities () para asegurarse de que se muestren correctamente en su página HTML.
Notas:
fuente
htmlspecialchars ()
realiza la mínima cantidad de codificación para garantizar que su cadena no se analice como HTML. Esto deja su cadena más legible para los humanos de lo que sería sihtmlentities ()
codificara absolutamente todo lo que tiene una codificación.fuente
Me acabo de enterar de la
get_html_translation_table
función. Lo pasaHTML_ENTITIES
oHTML_SPECIALCHARS
y devuelve una matriz con los caracteres que se codificarán y cómo se codificarán.fuente
htmlentities: convierte todos los caracteres aplicables en entidades HTML.
htmlspecialchars - Convierte caracteres especiales en entidades HTML.
Las traducciones realizaron caracteres de traducción en el siguiente:
Puede consultar el siguiente código para obtener más información sobre lo que son htmlentities y htmlspecialchars:
https://gist.github.com/joko-wandiro/f5c935708d9c37d8940b
fuente
Probablemente desee utilizar alguna codificación de caracteres Unicode, por ejemplo UTF-8 y htmlspecialchars. Porque no hay ninguna necesidad de generar "entidades HTML" para "todos [los] caracteres aplicables" (que es lo que hace htmlentities según la documentación) si ya está en su juego de caracteres.
fuente
Un pequeño ejemplo, necesitaba tener 2 nombres de clientes indexados en una función:
Originalmente, lo
$term = get_term_by('name', htmlentities($name), 'client');
que dio como resultado nombres de términos que solo incluían el elemento de matriz (&) pero no el elemento acentuado. Pero cuando cambié la configuración de la variable ahtmlspecialchars
ambas, pude ejecutar la función. ¡Espero que esto ayude!fuente
Las diferencias entre htmlspecialchars () y htmlentities () son muy pequeñas. Veamos algunos ejemplos:
htmlspecialchars (string $ string) toma múltiples argumentos donde el primer argumento es una cadena y todos los demás argumentos (ciertas banderas, ciertas codificaciones, etc.) son opcionales. htmlspecialchars convierte caracteres especiales en la cadena a entidades HTML. Por ejemplo, si tiene <br> en la cadena, htmlspecialchars se convertirla en & lt; b & gt; . Mientras que los caracteres como µ † etc. no tienen un significado especial en HTML. Por lo tanto, no se convertirán en entidades HTML mediante la función htmlspecialchars como se muestra en el ejemplo a continuación.
htmlentities (string $ string) es muy similar a htmlspecialchars y toma múltiples argumentos donde el primer argumento es una cadena y todos los demás argumentos son opcionales (ciertas banderas, ciertas codificaciones, etc.). A diferencia de htmlspecialchars , htmlentities convierte no solo caracteres especiales en la cadena a entidades HTML sino todos los caracteres aplicables a entidades HTML.
fuente
https://dev.w3.org/html5/html-author/charref
No completamente, por favor rastree el enlace para documentar completamente.
fuente