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

3

我需要帮助制作一个正则表达式,以删除两个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>

4
正则表达式很少是处理 HTML 的正确答案。考虑使用 DOM 解析器。 - SDC
我同意你的观点,但对于我正在进行的操作来说并不是一个选项,因为我必须在后端完成这个任务。 - user717236
1
后端与此无关:PHP内置了一个DOM解析器(DomDocument)。 - SDC
你是对的。我说错了。我正在进行许多编辑,上面只是其中之一。我并不反对你使用DOM解析器的建议,但上述问题只是我任务中更大画面的一个方面。但你关于DOM解析器的观点是正确的。 - user717236
这可能使DOM解析器成为更好的解决方案。几乎唯一反对使用解析器来处理此类内容的好理由是,如果您只对代码进行小修补,则可能会过度杀伤。即便如此,它通常也比正则表达式更好的解决方案。但是,如果您正在对HTML代码进行大量编辑,则更有利于使用DOM解析器。 - SDC
1个回答

2
更简洁的解决方案是:
s/(<[^>]*>[^<]*)\/>/$1/g

它将一个起始标签和可能跟随的内容分组,不包括起始的角括号 - 这将指示另一个标签。然后查找/>。如果找到,就使用替换来去除它。

更新:问题被扩展以删除可能出现在/>之前的空格。可以通过使[^<]*部分“懒惰”来实现:

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

你可以在regex101(最新链接)上自己看一下。


哦,哇!我很高兴问了这个问题。那个网站太棒了。你的解决方案同样出色。我会在实践中尝试并进行评估。非常感谢你的贡献! - user717236
问题?如何删除内容和/>之间的空格?在您的示例中,/>已被删除,但空格仍然存在。我尝试在您的正则表达式表达式中在/>之前添加\s*,但它没有起作用。 - user717236
我原本想建议我经常使用的排除技术,但在这种情况下,您的答案更快。 :) - zx81

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接