使用c#配对html标签?

时间:2015-07-17 23:47:58

标签: c# html

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

但我无法弄清楚如何检查任何标签对是否重叠。例如。

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

   |____________|
         |______________|

(会有很多对)

要澄清,这个问题是关于配对匹配,而不是关于其他所有的HTML,谢谢!

2 个答案:

答案 0 :(得分:1)

如果您想匹配标签对(旁边没有配对标签),请考虑以下事项:

  • 从左到右,枚举所有标签;
  • 如果你看到一个开头的标签,请放入堆栈;
  • 如果您看到结束标记,请检查相应的开始标记是否位于堆栈顶部;如果是 - 弹出它,否则报告错误;
  • 最后,检查堆栈是否为空。

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

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;
}

答案 1 :(得分:0)

您可能必须使用与stack类似的内容来实现您正在寻找的内容。堆栈是否包含开口标记,并且只能移除顶部标记(因此,如果添加了任何其他开放标记但未关闭,则无法删除隐藏在其下方的标记)。

可以轻松检查某些内容是否已关闭或是否有资格关闭。如果其匹配标记不在堆栈顶部,则在您关闭其上方的标记之前,它无法关闭。