【问题标题】:Regex to match URL / URI except when contained in an img tag正则表达式匹配 URL / URI,除非包含在 img 标记中
【发布时间】:2013-05-03 15:51:11
【问题描述】:

感谢 dfowler 出色的 Jabbr 项目,我正在借用代码来嵌入用户帖子中的链接内容。代码来自here,并使用正则表达式提取 URL 以进行额外处理和嵌入。

在我的例子中,我首先通过 Markdown 处理器运行用户帖子,然后再尝试嵌入。如果用户正确格式化 markdown,markdown 处理器 (MarkdownDeep) 会将任何给定的图像 markdown 转换为有效的 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 会匹配 或在超链接中&lt;a href='http://www.example.com/sites/default/files/DellComputer.jpg'&gt; 匹配但&lt;img src='http://www.example.com/sites/default/files/DellComputer.jpg'&gt; 不匹配。

感谢您的帮助,我知道你们中的一些人有专家级的正则表达式才能,但我永远做不到。

【问题讨论】:

  • 图像是具有特定扩展名的东西,还是您想要二进制检查?
  • 无二进制检查。无论是否包含图像,都匹配 URL,但如果包含在 html img 标记中,则排除 URL。
  • 处理并删除 img 标签,然后将其余部分作为 URL 进行匹配。在一个正则表达式中做太多事情只会使编写、调试和维护变得不必要地复杂。
  • 这是一个巨大的正则表达式。那将完全匹配什么?您提供的网址至少都不匹配。
  • @nhahtdg,这可能是更好的解决方法。如果正则表达式方法失败了,我会搞砸的。

标签: c# regex markdowndeep


【解决方案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 在它上线之前的位置,我可能会建议使用正则表达式以外的工具。

【讨论】:

  • 这不包括应该匹配并执行嵌入的Hey, check out this imgur link: &lt;a href="http://imgurexample.com/gallery/y5wtqlf"&gt;link text&lt;/a&gt;。我想我将不得不使用您对另一个工具的建议......可能是@nhahtdh 建议去除有效的 img 标签,然后处理......
  • 是的,这就是我的意思。如果您需要更多智能,您应该使用其他工具,可能是 xml 解析器,而不是尝试使用正则表达式 (obligatory link) 解析 html
猜你喜欢
  • 1970-01-01
  • 2018-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多