我需要一些帮助来制作正则表达式,删除/>两个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>
答案 0 :(得分:2)
更短的解决方案是:
s/(<[^>]*>[^<]*)\/>/$1/g
它将开始标记和可能的后续内容分组,不包括开口角括号 - 这将指示另一个标记。然后它会查找/>
。如果找到,则使用替换来删除它。
更新:问题已扩展到/>
之前删除可能的空格。这可以通过使[^<]*
部分“懒惰”这样来完成:
s/(<[^>]*>[^<]*?)\s*\/>/$1/g
在regex101上自行查看(链接已更新)。