我有一个字符串作为HTML源,我想检查是否字符串的HTML源代码包含未打开的标签。检查未打开的标签的HTML字符串
例如下面的字符串包含</u>
之后的WAVEFORM没有开放<u>
。
WAVEFORM</u> YES, <u>NEGATIVE AUSCULTATION OF EPIGASTRUM</u> YES,
我只是想检查这些类型的未开封的标签,然后我不得不打开标签附加到字符串的开始?
我有一个字符串作为HTML源,我想检查是否字符串的HTML源代码包含未打开的标签。检查未打开的标签的HTML字符串
例如下面的字符串包含</u>
之后的WAVEFORM没有开放<u>
。
WAVEFORM</u> YES, <u>NEGATIVE AUSCULTATION OF EPIGASTRUM</u> YES,
我只是想检查这些类型的未开封的标签,然后我不得不打开标签附加到字符串的开始?
对于这种特定情况,如果HTML格式正确或者您的标签未打开,您可以使用HTML Agility Pack来断言。
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);
}
不那么容易。你不能直接使用HTML解析器,因为它不是有效的HTML,但是你不能直接抛出一个正则表达式,因为正则表达式不能处理嵌套或其他HTML复杂问题。
大概你可以做的最好的事情是使用正则表达式来找到每个标记结构,例如。例如:
<(\w+)(?:\s+[-\w]+(?:\s*(?:=\s*(?:"[^"]*"|'[^']*'|[^'">\s][^>\s]*)))?)*\s*>
|</(\w+)\s*>
|<!--.*?-->
从空标签打开列表和空标签关闭列表开始。对于字符串中的每个匹配项,查看组1和2以查看是否有开始或结束标记。 (或者你可以忽略的评论。)
如果你有一个开始标签,你需要知道它是否需要关闭,即。如果它是<img>
之类的EMPTY
内容模型标记之一。如果一个元素是EMPTY
,它不需要关闭,所以你可以忽略它。 (如果您有XHTML,则会更容易一些。)
如果您有开始标记,请将正则表达式组中的标记名称添加到标记关闭列表中。如果你有一个结束标签,从标签到结束列表的末尾取一个标签(它应该与标签名称相同,否则你的标签无效)。如果没有标签标签 - 关闭列表,而是将标签名称添加到标签打开列表中
一旦您到达输入字符串的末尾,请将每个标签打开标签添加到字符串以相反的顺序,并追加标签 - 关闭到结束,再次以相反的顺序。
(是的,我解析HTML与正则表达式。我认为这种无效性为什么你不想要,如果有什么可以做的,以避免已经在标签的中间删除了标记,那就这么做)。
html标记和正则表达式不是一个好主意 – 2010-07-02 13:56:21
天哪,真的,你觉得呢? – bobince 2010-07-02 16:46:59