查找具有格式不佳的结束标记的特定HTML标记

时间:2015-12-11 19:08:06

标签: regex

我在修改没有 /> 结束标记的特定XHTML标记(在此示例中为IMG标记)中进行REGEX查找/替换时遇到问题。

考虑这两行示例文本:

<div id="newdocs-logo"><img src="../../../_DOC_DEPT/common/logo-white-250w.gif" alt="CloudPassage logo" height="38" width="251" /></div> 

<p class="newdocs-indent"><img src="CSM/config-scanning.png" width="692" height="359"></p>

只有当我在捕获组#3的否定字符类中包含a-z时,以下REGEX才能正常工作:

(<img)(.*?)([^a-z\/])(\>)

替换字符串:

$1$2$3/$4

如果不这样做,我必须在字符类中包含a-z,然后在示例文本的第1行中,REGEX继续经过正确关闭的IMG标记,并找到DIV标记的结束标记。我已经绕过圈子试验前瞻/后方等等,但是无法想出更好的东西。

Illustration of working and non-working REGEX

虽然我有一个可行的解决方案,但我很想知道是否有一个更优雅的方法来做这个,在否定的字符类中不需要a-z

1 个答案:

答案 0 :(得分:5)

这对于正则表达式实际上非常简单。像img这样的空标签实际上是非常规则的。

假设img>之间至少有一个字符,这个正则表达式将起作用:

(<img[^>]*[^\/])>

基本上,它会捕获<img,然后捕获所有内容,直到>之前的最后一个字符。如果该字符不是/,您将获得匹配,并且可以使用替换字符串:$1/>

(如果没有匹配,那么您的代码已经正确关闭。)