utf8 texto htmlentity html_entity_decode html_entities escape ent_compat php html html-entities htmlspecialchars

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 para ENT_HTML401 , y ENT_XHTML y ENT_XML1 . ENT_HTML5 embargo, para ENT_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 , se ENT_IGNORE las mismas secuencias de unidades de código no válidas de ENT_SUBSTITUTE y no se realiza ninguna sustitución (depende de la elección del "tipo de documento", por ejemplo, ENT_HTML5 )
  • No permitir 
 para ENT_HTML5 ( línea 976 )
  • ENT_XHTML comparte el mapa de la entidad con ENT_HTML401 . La única diferencia es que ' se convertirá en un apóstrofe con ENT_XHTML mientras que ENT_HTML401 no lo convierte (vea esta línea )
  • ENT_HTML401 y ENT_XHTML usan exactamente el mismo mapa de entidades (menos la diferencia con el punto anterior). ENT_HTML5 usa su propio mapa. Otros (actualmente ENT_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 que ENT_XML1 , excepto ENT_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).