【问题标题】:javascript regex to find image urls in stringjavascript 正则表达式在字符串中查找图像 url
【发布时间】:2015-06-03 03:16:05
【问题描述】:

我正在使用 Javascript 正则表达式来解析图像 url 的数据库字段并将它们格式化以输出 - 到目前为止,我一直在使用

input = input.replace(/(https?:\/\/.*?\.(?:png|jpe?g|gif)(.*))(\w|$)/ig, "<br><img style='max-width:100%;overflow:hidden;' src='$1'>");

它一直很好地为我服务。所有 png、jpe?g 和 gif 引用都被 IMG 标记替换,并且图像按预期显示在输出流中。

但是,我被抛出了一个循环。

我注意到一些网址(尤其是来自 Facebook CDN 的网址 - 尽管我认为其他人也可能这样做)在图像类型之后附加了一大堆“东西”......如果不存在结果的东西在文件不可用的情况下,会产生丢失的图像图标。例如,这是来自 fbcdn.net 的有效图片 url:

https://scontent-lga1-1.xx.fbcdn.net/hphotos-xtf1/v/t1.0-9/11147160_10156300867440377_5455334309678688318_n.jpg?oh=916e68ac2c908bbe15961825c373d6bc&oe=5606B6F4

有人可以建议对正则表达式进行更改/改进以获取额外的尾随字符吗?或者是否需要另一种攻击方法

(我个人喜欢全局正则表达式,因为我可以一次确定流中的所有实例......不必手动解析流不是我所期待的......)

更新:我知道请求中有一些含糊不清 - 希望这会澄清。

我需要提取任何图像 url - 无论图像扩展后的“东西”如何。它可能是文本字符串中的第一项,也可能是最后一项,或者嵌入在中间的某个位置。

处理是在 Javascript 中完成的。我目前正在使用它作为我的有效性测试。其中的所有图片都是从 Google 图片搜索中提取的有效 url。

http://well-being.esdc.gc.ca/misme-iowb/auto/diagramme-chart/stg2/c_4_21_6_1_eng.png?20150508104424447 This is arbitrary text https://scontent-lga1-1.xx.fbcdn.net/hphotos-xtf1/v/t1.0-9/11147160_10156300867440377_5455334309678688318_n.jpg?oh=916e68ac2c908bbe15961825c373d6bc&oe=5606B6F4 this is arbitrary text

http://lh6.ggpht.com/-1Rua79J-EDo/TwuyZkHwcmI/AAAAAAAADvA/ENfg1TeayvU/type_catalog_error_thumb%25255B1%25255D.jpg?imgmax=800 this is arbitrary text http://image.slidesharecdn.com/top5thingstodoafteranaccident-140826163850-phpapp02/95/top-five-things-to-do-after-any-type-of-accident-causing-injury-1-638.jpg?cb=1409089267

希望这对我可能遇到的变化类型有足够的了解(我唯一确定的是 FBCDN - 我的其他人基于我在外面看到的其他知识......所以需要通用的解决方案,而不是特定于 FBCDN 的解决方案)。

感谢所有提供建议的人......

【问题讨论】:

  • 要捕捉可选的问号和其他问题,您可以使用(\?blabla)?,但输入这听起来太容易了。有问题吗?
  • @MrLister - 是的,问题是我盯着它看的时间太长了,我在 regexpal.com 上的测试一无所获。我尝试的所有变体要么太贪心,要么不够贪心。 FB 网址具有一定的一致性——但我确信我应该将自己限制在这一点上。我还看到一些(示例不可用,抱歉)附加了尺寸信息,还有一些似乎附加了时间戳(用于缓存?)谁知道其他人放了什么邪恶的混合物。

标签: javascript regex


【解决方案1】:

在 OP 更新后更新了更多示例输入。

您的尝试存在三个问题:匹配边界、使用 '.*' 和缺少合法后缀的模式。

点星符号在 RegEx 中是个坏主意,文章“Death to Dot Star!”很好地说明了这一点。改用否定字符类,这里我选择了“\S*?”这是“任何不是空格的字符”。如果您尝试将其替换为“。*?”而在regex101 上,您会看到它无法正确匹配(它包含一个不是图像的链接)。

由于它们都在同一个字符串中,因此必须为匹配定义边界,并且由于空格足够,“\b”可以很好地解决问题。这也消除了对“(.*)”和“(\w|$)”部分的需要。

您最后错过的是 url 的合法结尾,对此有两种解决方案:定义您认为合理的内容以包含大多数场景并且没有误报,或者包含任何内容但有机会获得结果太多。

将它们组合在一起,您将得到以下两种不同的方法:

解决方案 1 - 定义什么是正确的

\b(https?:\/\/\S*?\.(?:png|jpe?g|gif)
  # allowed postfixes to the filetype
  (?:\?(?:
    # alphnumeric key/value pairs
    (?:(?:[\w_-]+=[\w_-]+)(?:&[\w_-]+=[\w_-]+)*)|
    # alphnumeric postfix
    (?:[\w_-]+)
  ))?
)\b

regex101尝试一下

解决方案 2 - 使用空格作为唯一因素

\b(https?:\/\/\S+(?:png|jpe?g|gif)\S*)\b

试试regex101

【讨论】:

  • 您的 regex101 链接已损坏
  • 我就是这么想的 ;)
  • @johnySkovdal - 我准备将其标记为答案...但后来我发现它仅与 FB url 匹配...更简单的东西,例如http://example.com/blah.jpg?fred 失败正如我对先生所说的那样。上面的Lister - 我无法确定其他人在那里做了什么邪恶的事情。
  • @ScottBrown:这就是为什么我要求您为我们提供更好的示例输入。您似乎只向我们展示了您在解析时遇到问题的那部分输入。如果不知道输入中还有什么内容,就不可能编写正确的正则表达式。例如。从您提供的示例中,“.*”是正确的。
  • @JohnySkovdal - 谢谢你的建议。我已经更新了一个更好的示例,它显示了更多的位置和内容。我不能保证不会遇到其他类型的 url。我已将您的 regex101 测试分叉到 regex101.com/r/zN8nZ1/1,不幸的是,这表明它太贪婪了,并且包含围绕 url 的任意文本(这是我自己的尝试卡住的地方)。
猜你喜欢
  • 2014-03-09
  • 2023-01-01
  • 2016-01-23
  • 2022-08-02
  • 1970-01-01
  • 1970-01-01
  • 2011-12-17
  • 2014-06-19
  • 1970-01-01
相关资源
最近更新 更多