【问题标题】:Checking a HTML string for unopened tags检查未打开标签的 HTML 字符串
【发布时间】:2011-03-11 00:22:50
【问题描述】:

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

例如下面的字符串在 WAVEFORM 后面包含</u>,它没有开头的<u>

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

我只想检查这些类型的未打开标签,然后我必须将打开标签附加到字符串的开头?

【问题讨论】:

    标签: c# .net html-parsing


    【解决方案1】:

    对于这种特定情况,您可以使用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); 
    }
    

    【讨论】:

      【解决方案2】:

      没那么容易。你不能直接使用 HTML 解析器,因为它不是有效的 HTML,但你不能轻易地在整个事情上抛出一个正则表达式,因为正则表达式无法处理嵌套或其他 HTML 复杂性。

      您能做的最好的事情可能就是使用正则表达式来查找每个标记结构,例如。类似:

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

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

      如果你有一个开始标签,你需要知道它是否需要关闭,即。如果它是EMPTY 内容模型标签之一,例如&lt;img&gt;。如果一个元素是EMPTY,它不需要关闭,所以你可以忽略它。 (如果您有 XHTML,这一切都容易一些。)

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

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

      (是的,我正在用正则表达式解析 HTML。我认为这说明了为什么你不想这样做。如果你可以做些什么来避免已经在标签中间剪断你的标记,那么做那个。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多