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

时间:2013-05-03 15:51:12

标签: c# regex markdowndeep

归功于dfowler优秀的Jabbr项目,我借用代码嵌入来自用户帖子的链接内容。代码来自here,并使用正则表达式提取URL以进行其他处理和嵌入。

就我而言,在尝试此嵌入之前,我首先通过降价处理器运行用户帖子。如果用户正确格式化降价,则降价处理器(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,但我在regex语法方面太差,无法自己实现它。

注意:如果图像只显示在文本中,我希望它仍匹配图像。所以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'>不匹配。

感谢您的帮助,我知道你们中有些人拥有优秀的正式人才,我从来没有做过。

1 个答案:

答案 0 :(得分:1)

对于简单的方法,只需前置

(?<!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在线之前的位置,我建议您使用除正则表达式之外的其他工具。