【问题标题】:Javascript Regex, Removing unclosed tagsJavascript 正则表达式,删除未关闭的标签
【发布时间】:2014-04-11 18:16:39
【问题描述】:

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

<div></div><span>

如您所见,我想删除 &lt;span&gt; 元素,我知道在标记上使用正则表达式是个坏主意,但它是我的项目所必需的,这是我制作的正则表达式模式,但它不起作用:

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

我正在使用 javascript replace 将所有匹配项替换为 "",我尝试使用我的模式来匹配 only 未封闭的标签,关于模式:

  1. [a-z] 我知道 html 标签可以包含 =,",etc,我正在寻找可以播放和编辑的简单模式,所以我从 [a-z] 开始
  2. 我使用!? 拒绝匹配结束标签。

我知道我的模式不起作用,如果有人有想法,我将非常感激。

编辑:

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

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

所以如果&lt;div&gt; 之后的下一个标签不是&lt;/div&gt; 则删除它。

【问题讨论】:

  • 说真的,在 Javascript 中使用完整的正则表达式解决方案是不可能的,因为 Javascript 正则表达式没有递归功能(处理嵌套标签的唯一方法,除了 .净)
  • 所以,只要确保我理解,&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;,这是完全有效的 html,你想要 &lt;div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt; 吗?
  • 是的,我要保留1级html
  • 我使用这个 html 解析器脚本来清理用户输入的所见即所得标记。它非常适合我的目的,但只处理 HTML4 标签。 John 脚本中的正则表达式可能有助于其他希望进行 Javascript DOM 解析的人。 ejohn.org/apps/htmlparser

标签: javascript regex


【解决方案1】:

首先,让我们看看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>"]

似乎我们的正则表达式匹配了太多的符号。我们必须在“

"<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>"

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

【讨论】:

    猜你喜欢
    • 2018-02-08
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    • 2010-12-02
    相关资源
    最近更新 更多