Javascript Regex,删除未关闭的标签

时间:2014-03-08 13:11:10

标签: javascript regex

我正在寻找javascript正则表达式解决方案来移除未关闭的标签,例如:

<div></div><span>

正如你所看到我想删除<span>元素,我知道在标记上使用正则表达式是一个坏主意,但它是我的项目所必需的,这是我制作的正则表达式模式但它不起作用:

/<([a-z]+?)>([\s\S]*?)(?!<\/\1>)/g

我正在使用javascript替换来替换所有匹配"",我尝试使用我的模式是匹配未关闭的标记,关于模式:

  1. [a-z]我知道html标签可以包含=,",etc,我正在寻找可以播放和编辑的简单模式,所以我开始使用[a-z]
  2. 我使用!?拒绝结束标记的匹配。
  3. 我知道我的模式不起作用,如果有人有想法,我会非常感激。

    修改

    我知道可能存在递归,如果是这种情况我想删除所有递归树,我只想保留1级html例如:

    <div><span></span></div><p></p>
    

    因此,如果<div>之后的下一个标记不是</div>,请将其删除。

1 个答案:

答案 0 :(得分:2)

首先,让我们看看OP说的话:

  • 我知道在标记上使用正则表达式是个坏主意,但这对我的项目来说是必需的。
  • 我只想保留1级html

这可以实现。

你走在正确的轨道上。但是,您不应该使用!?来拒绝关闭标记的匹配项。你想接受它们。这样一来,比赛就不会接受我们追求的非封闭标签。

现在,你的正则表达式将是这样的。

/<([a-z]+?)>([\s\S]*?)(<\/\1>)/g

我们可以删除第二个和第三个括号,因为它们不是必需的:

/<([a-z]+?)>[\s\S]*?<\/\1>/g

如果我们在提供的代码上测试此正则表达式将获得以下内容:

"<div><span></span></div><p></p>".match(/<([a-z]+?)>[\s\S]*?<\/\1>/g)
["<div><span></span></div>", "<p></p>"]

似乎我们的正则表达式符合TOO MUCH符号。我们必须打破“&lt;”的比赛符号,因为它表示新标签。 [^&lt;]表示“任何字符但是”&lt;“。

"<div><span></span></div><p></p>".match(/<([a-z]+?)>[^<]*?<\/\1>/g)
["<span></span>", "<p></p>"]

最后,我们可以加入匹配的结果。

"<div><span></span></div><p></p>".match(/<([a-z]+?)>[^<]*?<\/\1>/g).join("")
"<span></span><p></p>"

Wohoooo。我将把正则表达式的第一部分留给你,因为它不是问题的一部分。我希望这可以帮到你。我愿意接受进一步的提问。