Не так просто.Вы не можете напрямую использовать синтаксический анализатор HTML, так как он не является действительным HTML, но вы не можете легко бросить регулярное выражение в целом, поскольку регулярные выражения не могут справиться с вложением или другими сложностями HTML.
Возможно, олучшее, что вы могли бы сделать, это использовать регулярное выражение, чтобы найти каждую структуру разметки, например.что-то вроде:
<(\w+)(?:\s+[-\w]+(?:\s*(?:=\s*(?:"[^"]*"|'[^']*'|[^'">\s][^>\s]*)))?)*\s*>
|</(\w+)\s*>
|<!--.*?-->
Начните с пустого списка тегов для открытия и пустого списка тегов для закрытия.Для каждого совпадения в строке посмотрите на группы 1 и 2, чтобы увидеть, есть ли у вас начальный или конечный тег.(Или комментарий, который вы можете игнорировать.)
Если у вас есть стартовый тег, вам нужно знать, нужно ли его закрывать, т.е.если это один из тегов EMPTY
модели содержимого, например <img>
.Если элемент EMPTY
, он не нуждается в закрытии, поэтому вы можете его игнорировать.(Если у вас есть XHTML, все немного проще.)
Если у вас есть стартовый тег, добавьте имя тега в группе регулярных выражений в список тегов для закрытия.Если у вас есть конечный тег, уберите один тег из конца списка закрывающих тегов (это должно быть то же имя, что и там, в противном случае вы получите недопустимую разметку. Если тегов нетсписок тегов для закрытия, вместо этого добавьте имя тега в список тегов для открытия.
Как только вы дойдете до конца строки ввода, добавьте каждый из тегов для открытия.теги к строке в обратном порядке и добавление тегов close для тегов-to-close к концу, снова в обратном порядке.
(Да, я анализирую HTML с помощью регулярных выражений. Я думаю, чтоГадость этого демонстрирует, почему вы этого не хотите. Если вы можете что-то сделать, чтобы избежать разметки вашей разметки в середине тега, сделайте это.)