Existen soluciones sofisticadas que implican la utilización del navegador para intentar analizar el texto, identificando si se construyeron nodos DOM, lo que será… lento. O expresiones regulares que serán más rápidas, pero ... potencialmente inexactas. También hay dos preguntas muy distintas que surgen de este problema:
P1: ¿Una cadena contiene fragmentos HTML?
¿La cadena es parte de un documento HTML, que contiene marcas de elementos HTML o entidades codificadas? Esto se puede usar como un indicador de que la cadena puede requerir blanqueo / desinfección o decodificación de entidades:
/</?[a-z][^>]*>|(\&(?:[\w\d]+|#\d+|#x[a-f\d]+);/
Puede ver este patrón en uso en todos los ejemplos de todas las respuestas existentes en el momento de escribir este artículo, además de algunos ... bastante espantosos textos de muestra generados en WYSIWYG o Word y una variedad de referencias de entidades de caracteres.
P2: ¿La cadena es un documento HTML?
La especificación HTML es sorprendentemente flexible en cuanto a lo que considera un documento HTML . Los navegadores hacen todo lo posible para analizar casi cualquier texto basura como HTML. Dos enfoques: simplemente considere todo HTML (ya que si se entrega con un tipo de text/html
contenido, el usuario-agente hará un gran esfuerzo para tratar de interpretarlo como HTML) o busque el marcador de prefijo:
<!DOCTYPE html>
En términos de "buena formación", eso y casi nada más se "requiere". El siguiente es un documento HTML 100% completo y totalmente válido que contiene todos los elementos HTML que cree que se están omitiendo:
<!DOCTYPE html>
<title>Yes, really.</title>
<p>This is everything you need.
Sip. Hay reglas explícitas sobre cómo formar "faltantes" elementos tales como <html>
, <head>
, y <body>
. Aunque me parece bastante divertido que el resaltado de sintaxis de SO no haya podido detectarlo correctamente sin una pista explícita.