正则表达式匹配URL/URI,除非包含在img标记中

问题描述:

借用dfowler杰出的Jabbr项目,我借用代码来嵌入用户帖子中的链接内容。该代码是从here,并使用正则表达式来提取URL进行额外的处理和嵌入。正则表达式匹配URL/URI,除非包含在img标记中

在我的情况下,我尝试通过一个降价处理器首先运行用户帖子,然后再尝试嵌入。降价处理器(MarkdownDeep)将在用户正确设置降价格式的情况下将任何给定的图片降价转换为有效的HTML img标签。然而,这很好用,使用嵌入式内容提供程序将使图像显示两次,因为它从降级转换中有效地显示,然后在嵌入后再嵌入。

所以,我相信我的问题的解决方案在于,当找到的URL已经包含在有效的img标签中时,将正则表达式更改为不匹配。

为了便于回答这个正则表达式到目前为止的是:

(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'"".,<>?«»“”‘’])) 

我想,我想使用负前瞻像this answer排除IMG,但我太可怜了,在正则表达式的语法来实行它自己。

注意:如果它们只出现在文本中,我希望它仍然匹配图像。所以http://www.example.com/sites/default/files/DellComputer.jpg将匹配 或在超链接<a href='http://www.example.com/sites/default/files/DellComputer.jpg'>会匹配,但<img src='http://www.example.com/sites/default/files/DellComputer.jpg'>不会。

感谢您的帮助,我知道你们中有些人拥有专家级的正则表达能力,我永远无法做到。

+0

图像是具有特定扩展名的东西,还是您想要二进制检查? – fotanus 2013-05-03 15:52:37

+0

没有二进制检查。无论图像与否都匹配URL,但如果包含在html img标签中则排除URL。 – mlutter 2013-05-03 15:55:42

+1

处理并删除'img'标签,然后将其余的网址与网址进行匹配。在一个正则表达式中做太多事情只会让写入,调试和维护变得不必要地复杂化。 – nhahtdh 2013-05-03 15:55:54

对于简单的方法,只是在前面加上

(?<!img.*) 

到你的正则表达式的开始。它会匹配它已经做的,但会拒绝它,如果img来到它之前的某处。所以,整个正则表达式:

(?<!img.*)(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'"".,<>?«»“”‘’])) 

再次,没有改变,除了在开始几个字符。

如果你需要它在img位于上线之前更聪明,我可能会推荐使用正则表达式以外的工具。

+0

这不包括'嘿,看看这个imgur链接: link text'这应该匹配和执行嵌入。我想我将不得不使用你的另一种工具的建议......可能@nhahtdh建议剥离有效的img标签,然后处理... – mlutter 2013-05-03 17:15:27

+0

是的,那是我的意思。如果你需要更多的智能,你应该使用另一个工具,可能是一个XML解析器,而不是试图用正则表达式解析HTML([必备链接](http://*.com/questions/1732348/regex-match-open-标签 - 除了-XHTML-自足标签)) – femtoRgon 2013-05-03 17:34:38