Es gibt ausgefallene Lösungen, bei denen der Browser selbst verwendet wird, um zu versuchen, den Text zu analysieren und festzustellen, ob DOM-Knoten erstellt wurden, was… langsam sein wird. Oder reguläre Ausdrücke, die schneller sind, aber… möglicherweise ungenau. Es gibt auch zwei sehr unterschiedliche Fragen, die sich aus diesem Problem ergeben:
Q1: Enthält eine Zeichenfolge HTML-Fragmente?
Ist die Zeichenfolge Teil eines HTML-Dokuments, das HTML-Element-Markup oder codierte Entitäten enthält? Dies kann als Indikator dafür verwendet werden, dass die Zeichenfolge möglicherweise gebleicht / bereinigt oder entifiziert werden muss:
/</?[a-z][^>]*>|(\&(?:[\w\d]+|#\d+|#x[a-f\d]+);/
Sie können dieses verwendete Muster sehen aller Beispiele aus allen zum Zeitpunkt dieses Schreibens vorhandenen Antworten sowie anhand einiger… ziemlich abscheulicher, von WYSIWYG oder Word generierter Beispieltexte und einer Vielzahl von Verweisen auf Zeichenentitäten sehen.
F2: Ist die Zeichenfolge ein HTML-Dokument?
Die HTML-Spezifikation ist schockierend locker, was ein HTML-Dokument betrifft . Browser sind extrem bemüht, fast jeden Mülltext als HTML zu analysieren. Zwei Ansätze: entweder einfach alles HTML berücksichtigen (da bei Lieferung mit einem text/html
Inhaltstyp große Anstrengungen unternommen werden, um zu versuchen , es vom Benutzeragenten als HTML zu interpretieren) oder nach dem Präfix-Marker suchen:
<!DOCTYPE html>
In Bezug auf "Wohlgeformtheit" ist das und fast nichts anderes "erforderlich". Das Folgende ist ein 100% vollständiges, vollständig gültiges HTML-Dokument, das jedes HTML-Element enthält, von dem Sie glauben, dass es weggelassen wird:
<!DOCTYPE html>
<title>Yes, really.</title>
<p>This is everything you need.
Jep. Es gibt explizite Regeln, wie „fehlende“ Elemente wie zu bilden <html>
, <head>
und <body>
. Obwohl ich es ziemlich amüsant finde, dass die Syntaxhervorhebung von SO dies ohne einen expliziten Hinweis nicht richtig erkennen konnte.