Проверка HTML представляет в виде строки для нераскрытых тегов

У меня есть строка как источник HTML, и я хочу проверить, содержит ли источник HTML, который является строкой, тег, который не открыт.

Например, строка ниже содержит </u> после ФОРМЫ СИГНАЛА, которая не имеет никакого открытия <u>.

WAVEFORM</u> YES, <u>NEGATIVE AUSCULTATION OF EPIGASTRUM</u> YES,

Я просто хочу проверить на эти типы нераскрытого тега, и затем я должен добавить открытый тег к запуску строки?

5
задан João Angelo 2 July 2010 в 10:42
поделиться

2 ответа

Для этого В конкретном случае вы можете использовать HTML Agility Pack , чтобы проверить, правильно ли сформирован HTML или у вас есть не открытые теги.

var htmlDoc = new HtmlDocument();

htmlDoc.LoadHtml(
    "WAVEFORM</u> YES, <u>NEGATIVE AUSCULTATION OF EPIGASTRUM</u> YES,");

foreach (var error in htmlDoc.ParseErrors)
{
    // Prints: TagNotOpened
    Console.WriteLine(error.Code);
    // Prints: Start tag <u> was not found
    Console.WriteLine(error.Reason); 
}
6
ответ дан 14 December 2019 в 13:25
поделиться

Не все так просто. Вы не можете напрямую использовать синтаксический анализатор HTML, поскольку это недействительный HTML, но вы не можете легко использовать регулярное выражение для всего этого, поскольку регулярные выражения не могут справиться с вложенностью или другими сложностями HTML.

Возможно, лучшее, что вы могли бы сделать, - это использовать регулярное выражение для поиска каждой структуры разметки, например. что-то вроде:

<(\w+)(?:\s+[-\w]+(?:\s*(?:=\s*(?:"[^"]*"|'[^']*'|[^'">\s][^>\s]*)))?)*\s*>
|</(\w+)\s*>
|<!--.*?-->

Начните с пустого списка открываемых тегов и пустого списка закрываемых тегов. Для каждого совпадения в строке просмотрите группы 1 и 2, чтобы узнать, есть ли у вас начальный или конечный тег. (Или комментарий, который вы можете проигнорировать.)

Если у вас есть начальный тег, вам нужно знать, нужно ли его закрывать, т.е. если это один из тегов модели содержимого EMPTY , например . Если элемент EMPTY , его не нужно закрывать, поэтому вы можете игнорировать его. (Если у вас есть XHTML, это все немного проще.)

Если у вас есть начальный тег, добавьте имя тега из группы регулярных выражений в список закрываемых тегов. Если у вас есть закрывающий тег, удалите один тег с конца списка закрываемых тегов (это должно быть то же имя тега, что и там, иначе у вас недопустимая разметка. Если тегов нет на список закрываемых тегов, вместо этого добавьте имя тега в список открываемых тегов.

Когда вы дойдете до конца входной строки, добавьте каждый тег открываемых тегов к строку в обратном порядке и добавьте закрывающие теги для закрывающих тегов в конец, снова в обратном порядке.

(Да, я анализирую HTML с помощью регулярного выражения. Я думаю, что это мерзость демонстрирует, почему вы не хочу. Если есть что-то, что вы можете сделать, чтобы избежать уже обрезанной разметки в середине тега, сделайте это.)

0
ответ дан 14 December 2019 в 13:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: