php - texto - ¿Qué hacen los modificadores ENT_HTML5, ENT_HTML401,… en html_entity_decode?
php string to html tags (1)
Desde php 5.4 html_entity_decode introduce cuatro nuevos indicadores, con una explicación mínima
ENT_HTML401 Handle code as HTML 4.01.
ENT_XML1 Handle code as XML 1.
ENT_XHTML Handle code as XHTML.
ENT_HTML5 Handle code as HTML 5.
Quiero entender para qué sirven. ¿En qué casos son significativos?
Mi conjetura, (pero me equivoco) es que cualquier estándar diferente, codifica algunos caracteres inusuales, pero cualquier otro no, así que para respetar eso, están aquí.
Mi investigación: htmlentities tiene la misma explicación mínima, sin ejemplos también. He buscado en Google sin suerte.
Comencé a preguntarme qué comportamiento tienen estas constantes cuando vi estas constantes en la página htmlspecialchars. La documentación era basura, así que empecé a escarbar en el código fuente de PHP.
Básicamente, estas constantes afectan si ciertas entidades están codificadas o no (o decodificadas para html_entity_decode
). El efecto más obvio es si el apóstrofe ( ''
) está codificado en '
(para ENT_HTML401
) o '
(para otros). Del mismo modo, determina si '
se decodifica o no cuando se utiliza html_entity_decode
. ( '
siempre se decodifica).
Todos los usos se pueden encontrar en ext / standard / html.c y su archivo de encabezado. Desde ext / standard / html.h:
#define ENT_HTML_DOC_HTML401 0
#define ENT_HTML_DOC_XML1 16
#define ENT_HTML_DOC_XHTML 32
#define ENT_HTML_DOC_HTML5 (16|32)
(Reemplace ENT_HTML_DOC_
por ENT_
para obtener sus nombres constantes de PHP)
Comencé a buscar todas las apariciones de estas constantes y puedo compartir lo siguiente sobre el comportamiento de las constantes ENT_*
:
- Afecta qué entidades numéricas serán decodificadas o no. Por ejemplo,

se decodifica a un carácter ilegible / ilegible paraENT_HTML401
, yENT_XHTML
yENT_XML1
.ENT_HTML5
embargo, paraENT_HTML5
, esto se considera un carácter no válido y, por lo tanto, permanece
. ( Función C unicode_cp_is_allowed ) - Con
ENT_SUBSTITUTE
habilitado, las secuencias de unidades de código no válidas para un conjunto de caracteres específico se reemplazan con. (¡No depende del tipo de documento!)
- Con
ENT_DISALLOWED
habilitado, los puntos de código que no están permitidos para el tipo de documento especificado se reemplazan con. (¡No depende del juego de caracteres!)
- Con
ENT_IGNORE
, seENT_IGNORE
las mismas secuencias de unidades de código no válidas deENT_SUBSTITUTE
y no se realiza ninguna sustitución (depende de la elección del "tipo de documento", por ejemplo,ENT_HTML5
) - No permitir

paraENT_HTML5
( línea 976 ) -
ENT_XHTML
comparte el mapa de la entidad conENT_HTML401
. La única diferencia es que'
se convertirá en un apóstrofe conENT_XHTML
mientras queENT_HTML401
no lo convierte (vea esta línea ) -
ENT_HTML401
yENT_XHTML
usan exactamente el mismo mapa de entidades (menos la diferencia con el punto anterior).ENT_HTML5
usa su propio mapa. Otros (actualmenteENT_XML1
) tienen un mapa de decodificación muy limitado (>
&
<
'
"
y sus equivalentes numéricos). (ver función C unescape_inverse_map ) - Nota para el punto anterior: cuando solo deben escaparse unas pocas entidades (piense en
htmlspecialchars
), todas las entidades asignarán el mismo queENT_XML1
, exceptoENT_HTML401
. Ese no usará'
, pero'
.
Eso cubre casi todo. No voy a enumerar todas las diferencias de entidades, en cambio me gustaría apuntar a https://github.com/php/php-src/tree/php-5.4.11/ext/standard/html_tables para algunos archivos de texto que contienen Las asignaciones para cada tipo.
¿Qué ENT_ * debo usar para htmlspecialchars?
Al usar htmlspecialchars
con ENT_COMPAT (predeterminado) o ENT_NOQUOTES, no importa cuál elija (ver más abajo). Vi algunas respuestas aquí en SO que se reduce a esto:
<input value="<?php echo htmlspecialchars($str, ENT_HTML5);?>" >
Esto es inseguro . ENT_HTML401 | ENT_COMPAT
valor predeterminado ENT_HTML401 | ENT_COMPAT
ENT_HTML401 | ENT_COMPAT
que tiene como diferencia que se utilizan las entidades HTML5, pero también que las comillas ya no se escapan! Además, este es un código redundante. Las entidades que deben estar codificadas por htmlspecialchars
son las mismas para todos ENT_HTML401
, ENT_HTML5
, etc.
Solo usa ENT_COMPAT
o ENT_QUOTES
en ENT_QUOTES
lugar. El último también funciona cuando usas apóstrofes para los atributos ( value=''foo''
). Si solo tiene dos argumentos para htmlspecialchars
, no incluya el argumento, ya que es el predeterminado ( ENT_HTML401
es 0, ¿recuerda?).
Cuando desea imprimir algo en la página (entre etiquetas, no atributos), no importa en absoluto cuál elija ya que tendrá el mismo efecto. Incluso es suficiente usar ENT_NOQUOTES | ENT_HTML401
ENT_NOQUOTES | ENT_HTML401
que es igual al valor numérico 0
.
Vea también a continuación, sobre ENT_SUBTITUTE y ENT_DISALLOWED.
¿Qué ENT_ * debo usar para htmlentities?
Si su editor de texto o base de datos es tan horrible que no puede incluir caracteres que no sean ASCII de EE. UU. (Por ejemplo, UTF-8), puede usar htmlentities. De lo contrario, guarde algunos bytes y use htmlspecialchars en su lugar (ver arriba).
Si necesita usar ENT_HTML401
, ENT_HTML5
o algo más, depende de cómo se sirve su página. Cuando tenga una página HTML5 ( <!doctype html>
), use ENT_HTML5
. ¿XHTML o XML? Utilice el ENT_XHTML
o ENT_XML1
correspondiente. Sin ningún tipo de documento o código HTML4, use ENT_HTML401
(que es el valor predeterminado cuando se omite).
¿Debo usar ENT_DISALLOWED, ENT_IGNORE o ENT_SUBSTITUTE?
De forma predeterminada, las secuencias de bytes que no son válidas para el conjunto de caracteres dado se eliminan. Para tener un en lugar de una secuencia de bytes no válida, especifique
ENT_SUBSTITUTE
. (tenga en cuenta que se muestra &#FFFD;
para conjuntos de caracteres que no son UTF-8). ENT_IGNORE
embargo, cuando especifica ENT_IGNORE
, estos caracteres no se muestran incluso si especificó ENT_SUBSTITUTE
.
Los caracteres no válidos para un tipo de documento se sustituyen por el mismo carácter de reemplazo (o su entidad) anterior cuando se especifica ENT_DISALLOWED
. Esto sucede independientemente de tener el conjunto ENT_IGNORE
(que no tiene nada que ver con caracteres no válidos para doctypes).