javascript正则表达式在字符串中查找图片网址

时间:2015-06-02 04:59:35

标签: javascript regex

我正在使用Javascript regEx来解析图像网址的数据库字段并将其格式化为输出 - 到目前为止,我一直在使用

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的有效图片网址:

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

有人可以建议对regEx进行更改/改进以获取额外的尾随字符吗?或者是另一种必要的攻击方法

(我个人喜欢全局的regEx,因为我可以立即修复流中的所有实例...必须手动解析流不是我期待的......)

更新:我知道请求中存在一些含糊不清的内容 - 希望这会澄清。

我需要提取任何图片网址 - 无论图像延伸后的“内容”如何。它可能是文本字符串中的第一个项目,也可能是最后一个项目,或者嵌入在中间的某个位置。

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

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特有的解决方案。

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

1 个答案:

答案 0 :(得分:3)

使用更多示例输入更新OP后更新。

您的尝试有三个问题:匹配的界限,使用&#39;。*&#39;法律后缀的缺失模式。

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

由于它全部在同一个字符串中,因此必须为匹配定义边界,因为空格足够了&#34; \ b&#34;诀窍很好。这也消除了对#34;(。*)&#34;和&#34;(\ w | $)&#34;部分。

你遗漏的最后一件事是网址的法律结局,并且有两种解决方案:要么定义你认为包含大多数情景并且没有误报的东西,要么包含任何有可能得到的东西结果太多了。

将所有这些包装在一起,您将有两种不同的方法:

解决方案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

上试用