Esistono soluzioni fantasiose che implicano l'utilizzo del browser stesso per tentare di analizzare il testo, identificando se sono stati costruiti nodi DOM, il che sarà ... lento. O espressioni regolari che saranno più veloci, ma ... potenzialmente imprecise. Ci sono anche due domande molto distinte che sorgono da questo problema:
Q1: una stringa contiene frammenti HTML?
La stringa fa parte di un documento HTML, contenente markup di elementi HTML o entità codificate? Questo può essere utilizzato come indicatore del fatto che la stringa potrebbe richiedere sbiancamento / sanificazione o decodifica di entità:
/</?[a-z][^>]*>|(\&(?:[\w\d]+|#\d+|#x[a-f\d]+);/
Puoi vedere questo modello in uso rispetto a tutti gli esempi da tutte le risposte esistenti al momento della stesura di questo articolo, oltre ad alcuni ... un testo campione generato da WYSIWYG o Word piuttosto orribile e una varietà di riferimenti a entità carattere.
Q2: la stringa è un documento HTML?
La specifica HTML è incredibilmente allentata su ciò che considera un documento HTML . I browser fanno di tutto per analizzare quasi tutti i testi inutili come HTML. Due approcci: o considera semplicemente tutto HTML (poiché se consegnato con un text/htmlContent-Type, sarà fatto un grande sforzo per cercare di interpretarlo come HTML dallo user-agent) o cerca il marcatore del prefisso:
<!DOCTYPE html>
In termini di "buona formazione", questo e quasi nient'altro è "richiesto". Quello che segue è un documento HTML completo e completamente valido al 100% contenente ogni elemento HTML che pensi venga omesso:
<!DOCTYPE html>
<title>Yes, really.</title>
<p>This is everything you need.
Sì. Ci sono delle regole esplicite su come formare gli elementi "mancanti", come <html>, <head>e <body>. Anche se trovo piuttosto divertente che l'evidenziazione della sintassi di SO non sia riuscita a rilevarlo correttamente senza un suggerimento esplicito.