Существуют причудливые решения, включающие использование самого браузера, чтобы попытаться проанализировать текст, определить, были ли созданы какие-либо узлы DOM, что будет… медленным. Или регулярные выражения, которые будут быстрее, но… потенциально неточными. Из этой проблемы также возникают два очень разных вопроса:
Q1: содержит ли строка фрагменты HTML?
Струнная часть HTML-документа, содержащего разметку HTML-элемента или закодированные объекты? Это может использоваться как индикатор того, что строка может потребовать обесцвечивания / дезинфекции или декодирования объекта:
/</?[a-z][^>]*>|(\&(?:[\w\d]+|#\d+|#x[a-f\d]+);/
Ты можешь видеть этот шаблон используется на всех примерах из всех существующих ответов на момент написания этой статьи, а также с некоторыми… довольно ужасными образцами текста, созданными WYSIWYG или Word, и множеством ссылок на символьные сущности.
Q2: Является ли строка HTML-документом?
Спецификация HTML шокирующе свободна в отношении того, что она считает документом HTML . Браузеры идут на все, чтобы проанализировать практически любой мусорный текст как HTML. Два подхода: либо просто рассмотрите весь HTML (поскольку, если он поставляется с text/html
Content-Type, будут затрачены большие усилия, чтобы попытаться интерпретировать его как HTML пользовательским агентом), либо найдите маркер префикса:
<!DOCTYPE html>
С точки зрения "правильности" это и почти ничего "не требуется". Ниже приводится 100% полный, полностью действительный HTML-документ, содержащий все элементы HTML, которые, по вашему мнению, опускаются:
<!DOCTYPE html>
<title>Yes, really.</title>
<p>This is everything you need.
Ага. Есть четкие правила о том , как сформировать «отсутствующие» элементы , такие как <html>
, <head>
, и <body>
. Хотя мне кажется довольно забавным, что подсветка синтаксиса SO не смогла правильно определить это без явной подсказки.