我正在寻找javascript正则表达式解决方案来移除未关闭的标签,例如:
<div></div><span>
正如你所看到我想删除<span>
元素,我知道在标记上使用正则表达式是一个坏主意,但它是我的项目所必需的,这是我制作的正则表达式模式但它不起作用:
/<([a-z]+?)>([\s\S]*?)(?!<\/\1>)/g
我正在使用javascript替换来替换所有匹配""
,我尝试使用我的模式是匹配仅未关闭的标记,关于模式:
[a-z]
我知道html标签可以包含=,",etc
,我正在寻找可以播放和编辑的简单模式,所以我开始使用[a-z]
!?
拒绝结束标记的匹配。我知道我的模式不起作用,如果有人有想法,我会非常感激。
修改
我知道可能存在递归,如果是这种情况我想删除所有递归树,我只想保留1级html例如:
<div><span></span></div><p></p>
因此,如果<div>
之后的下一个标记不是</div>
,请将其删除。
答案 0 :(得分:2)
首先,让我们看看OP说的话:
这可以实现。
你走在正确的轨道上。但是,您不应该使用!?
来拒绝关闭标记的匹配项。你想接受它们。这样一来,比赛就不会接受我们追求的非封闭标签。
现在,你的正则表达式将是这样的。
/<([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。我将把正则表达式的第一部分留给你,因为它不是问题的一部分。我希望这可以帮到你。我愿意接受进一步的提问。