需要正则表达式来删除/>两个HTML标记标记之间除了img标记

时间:2013-03-06 15:54:05

标签: javascript html regex perl markup

我需要一些帮助来制作正则表达式,删除/>两个HTML标记标记之间。

<!-- The line could look like this -->
<td align=right valign=bottom nowrap><div>January 24, 2013 /></div></td>

<!-- Or this -->
<div>Is this system supported? /></div>

<!-- Even this -->
<span>This is a span tag /></div>

<!-- It could look like any of these but I do not want /> removed -->
<img src="example.com/example.jpg"/></img>
<img src="example.com/example.jpg"/>
<img src="example.com/example.jpg"/></img>
<div id="example"><img src="example.com/example.jpg"/></div>

(是的,我知道img标签没有与之关联的结束标签。我正在动态编辑我没有创建的无数页面;它不是我的标记。)

这是我提出的正则表达式(使用perl):

s|(<.*?>(?!<img).*?)(\s*/>)(?!</img>)(</.*?>)|$1$3|gi;

是否有更高效或更快的正则表达式?

将正则表达式应用于上述示例后,结果如下:

<!-- The line could look like this -->
<td align=right valign=bottom nowrap><div>January 24, 2013></div></td>

<!-- Or this -->
<div>Is this system supported?></div>

<!-- Even this -->
<span>This is a span tag></div>

<!-- It could look like any of these but I do not want /> removed -->
<img src="example.com/example.jpg"/></img>
<img src="example.com/example.jpg"/>
<img src="example.com/example.jpg"/></img>
<div id="example"><img src="example.com/example.jpg"/></div>

1 个答案:

答案 0 :(得分:2)

更短的解决方案是:

s/(<[^>]*>[^<]*)\/>/$1/g

它将开始标记和可能的后续内容分组,不包括开口角括号 - 这将指示另一个标记。然后它会查找/>。如果找到,则使用替换来删除它。

更新:问题已扩展到/>之前删除可能的空格。这可以通过使[^<]*部分“懒惰”这样来完成:

s/(<[^>]*>[^<]*?)\s*\/>/$1/g

regex101上自行查看(链接已更新)。