如何使用Regex检查所有html标签是否已关闭

时间:2011-09-23 09:16:13

标签: javascript html regex

我的意思是每个<应该有一个合适的>。没有任何<>的字符串也应该有效。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

如果有两个连续的开始或结束括号,并且它们之间只有非括号字符,那么您的字符串将有一个未正确打开或关闭的标记。

将匹配这些
<(?=[^>]*<)|>(?=[^<]*>)

请注意,这只能在没有脚本部分或注释的html上可靠地运行!此外,这只会检查括号。它不会检查您打开的每个标签是否再次关闭。 (即它会将<<a>视为错误,但不会<a></b>

答案 1 :(得分:0)

有一次,我创建了一个JavaScript BB代码解析器,它也处理了错误关闭的标签。相同的概念也适用于HTML(以及依赖树的任何其他标记语言)。

  1. 定义变量:var string = ""; var lastIndex = 0; var stack = []; var parsedString = ""///And some more
  2. 使用<
  3. 循环播放字符串,直到string.indexOf("<", lastIndex)匹配为止
  4. 选择标记名称,然后搜索结束>(使用RE:/[^<]+?/)。将lastIndex设置为此>的索引加上1。
  5. 将此值(tagName)添加到数组中(让我们定义此数组:var stack = [];)。
  6. 如果遇到结束标记,请从最后一个元素开始遍历堆栈。
  7. 如果开始标记是stack的最后一个元素,请使用stack.pop()。继续1。
  8. 如果开始标记不是数组的最后一个元素:
    • 如果您的代码很重要,请坚持查找开始代码(</div>应关闭任何<div>,即使您必须丢弃9001 <span>声明。)
    • 当您浏览阵列时,请检查遇到的标记的状态:这些“重要”元素是什么? (例如){<strong>不如<div>重要。
    • 如果您遇到重要标记(例如<div>),而结束标记为</em>,请忽略结束标记并返回1.
  9. 如果1评估为false(未找到<),请将剩余字符串添加到结果resultString += string.substring(lastIndex, string.length);

    执行这些步骤后,您已经解析了一个字符串。