使用c#对html标签进行配对

本文关键字:html 使用 标签 | 更新日期: 2023-09-27 18:03:30

尝试使用c#创建一个HTML检查器,但我只是不知道如何检查两个HTML标签是否正确配对<body></body>。我设法把所有相关的标签放入字典(与/在前面的结束标签),按照它们出现在输入中的顺序。我还可以检查不关闭的开始标记(反之亦然)。

但是我不知道如何检查是否有任何对标签重叠。例如

<body><title></body></title>

   |____________|
         |______________|

(会有很多很多对)

澄清一下,这个问题是关于对匹配,而不是关于其他所有html,谢谢!

使用c#对html标签进行配对

如果要匹配成对的标记(非成对的标记除外),请考虑以下事项:

  • 从左到右,枚举所有标签;
  • 如果你看到开始标签,把它放到堆栈中;
  • 如果你看到一个结束标签,检查相应的开始标签是否在堆栈的顶部;
  • 最后,检查堆栈是否为空。

为了简单起见,让我用括号代替标签来说明这个想法。函数检查括号()[]{}是否正确平衡。

static bool CheckString(string s)
{
    var stack = new Stack<char>();
    foreach(char c in s)
        if("([{".Contains(c))
            stack.Push(c);
        else if(")]}".Contains(c))
        {
            if(stack.Count == 0)
                return false;
            char d = stack.Pop();
            if(d == '(' && c != ')' || d == '[' && c != ']' || d == '{' && c != '}')
                return false;
        }
    return stack.Count == 0;
}

您可能必须使用类似于stack的东西来实现您正在寻找的内容。让堆栈包含开始标签,并且只有顶部标签可以被删除(因此,如果添加了任何其他开始标签但未关闭,则不能删除埋在下面的标签)。

使检查某些东西是否已经关闭或是否有资格关闭变得容易。如果它匹配的标记不在堆栈的顶部,则在关闭其上面的标记之前不能关闭它。