Проверка строки HTML на наличие неоткрытых тегов - PullRequest
5 голосов
/ 02 июля 2010

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

Например, приведенная ниже строка содержит </u> после WAVEFORM, которая имеетнет открытия <u>.

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

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

Ответы [ 2 ]

6 голосов
/ 02 июля 2010

В этом конкретном случае вы можете использовать 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); 
}
0 голосов
/ 02 июля 2010

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

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

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

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

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

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

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

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

...