Il existe des solutions sophistiquées impliquant l'utilisation du navigateur lui-même pour tenter d'analyser le texte, en identifiant si des nœuds DOM ont été construits, ce qui sera… lent. Ou des expressions régulières qui seront plus rapides, mais… potentiellement inexactes. Deux questions très distinctes se posent également à propos de ce problème:
Q1: Une chaîne contient-elle des fragments HTML?
La chaîne fait-elle partie d'un document HTML, contenant un balisage d'élément HTML ou des entités codées? Cela peut être utilisé comme un indicateur que la chaîne peut nécessiter un blanchiment / désinfection ou un décodage d'entité:
/</?[a-z][^>]*>|(\&(?:[\w\d]+|#\d+|#x[a-f\d]+);/
Vous pouvez voir ce modèle utilisé contre tous les exemples de toutes les réponses existantes au moment de la rédaction de cet article, ainsi que quelques exemples de texte ... plutôt hideux générés par WYSIWYG ou Word et une variété de références d'entités de caractères.
Q2: La chaîne est-elle un document HTML?
La spécification HTML est incroyablement lâche quant à ce qu'elle considère comme un document HTML . Les navigateurs vont à l'extrême pour analyser presque tous les textes inutiles au format HTML. Deux approches: soit simplement considérer tout HTML (car s'il est livré avec un text/html
Content-Type, un gros effort sera dépensé pour essayer de l'interpréter comme HTML par l'agent utilisateur) ou rechercher le marqueur de préfixe:
<!DOCTYPE html>
En termes de "bonne formation", cela, et presque rien d'autre n'est "requis". Ce qui suit est un document HTML 100% complet et entièrement valide contenant tous les éléments HTML que vous pensez être omis:
<!DOCTYPE html>
<title>Yes, really.</title>
<p>This is everything you need.
Ouaip. Il existe des règles explicites sur la façon de former des éléments « manquants » tels que <html>
, <head>
et <body>
. Bien que je trouve plutôt amusant que la coloration syntaxique de SO n'ait pas réussi à détecter cela correctement sans un indice explicite.