2010-07-02 66 views
5

我有一个字符串作为HTML源,我想检查是否字符串的HTML源代码包含未打开的标签。检查未打开的标签的HTML字符串

例如下面的字符串包含</u>之后的WAVEFORM没有开放<u>

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

我只是想检查这些类型的未开封的标签,然后我不得不打开标签附加到字符串的开始?

回答

6

对于这种特定情况,如果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); 
} 
0

不那么容易。你不能直接使用HTML解析器,因为它不是有效的HTML,但是你不能直接抛出一个正则表达式,因为正则表达式不能处理嵌套或其他HTML复杂问题。

大概你可以做的最好的事情是使用正则表达式来找到每个标记结构,例如。例如:

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

从空标签打开列表和空标签关闭列表开始。对于字符串中的每个匹配项,查看组1和2以查看是否有开始或结束标记。 (或者你可以忽略的评论。)

如果你有一个开始标签,你需要知道它是否需要关闭,即。如果它是<img>之类的EMPTY内容模型标记之一。如果一个元素是EMPTY,它不需要关闭,所以你可以忽略它。 (如果您有XHTML,则会更容易一些。)

如果您有开始标记,请将正则表达式组中的标记名称添加到标记关闭列表中。如果你有一个结束标签,从标签到结束列表的末尾取一个标签(它应该与标签名称相同,否则你的标签无效)。如果没有标签标签 - 关闭列表,而是将标签名称添加到标签打开列表中

一旦您到达输入字符串的末尾,请将每个标签打开标签添加到字符串以相反的顺序,并追加标签 - 关闭到结束,再次以相反的顺序。

(是的,我解析HTML与正则表达式。我认为这种无效性为什么你不想要,如果有什么可以做的,以避免已经在标签的中间删除了标记,那就这么做)。

+0

html标记和正则表达式不是一个好主意 – 2010-07-02 13:56:21

+2

天哪,真的,你觉得呢? – bobince 2010-07-02 16:46:59