【问题标题】:Any preg_match() to extract image urls from text?任何 preg_match() 从文本中提取图像 url?
【发布时间】:2011-01-09 17:38:58
【问题描述】:

我需要 preg_match() 语法或类似的东西来提取 JPG 或 PNG 或 GIF 网址混合文本并将它们放在一个数组中或最后存储第一个 url。

也许某些语法会搜索以 http 开头并以 jpg/png/gif.. 结尾的字符串。

我相信这可以通过 preg_match()

完成

注意:文字可以是这样的:blablablabla"http://www.example.com/xxx.jpg"blablablabla

【问题讨论】:

    标签: php regex preg-match


    【解决方案1】:

    请注意他们可以欺骗您的服务器插入假匹配的特殊场合。

    例如:

    http://www.myserver.com/virus.exe?fakeParam=.jpg
    

    或者

    http://www.myserver.com/virus.exe#fakeParam=.jpg
    

    我已经快速修改了正则表达式以避免这种情况,但我很确定可能还有更多(例如,在文件路径中插入 %00,并且不容易被正则表达式解析)

    $matches = array();
    preg_match_all('!http://[^?#]+\.(?:jpe?g|png|gif)!Ui' , $string , $matches);
    

    因此,为了安全起见,始终以最严格的方式使用正则表达式,例如,如果您知道服务器,将其写入正则表达式,或者如果您知道路径总是包含字母、连字符、点、斜杠和数字,请使用如下表达式:

    $matches = array();
    preg_match_all('!http://[a-z0-9\-\.\/]+\.(?:jpe?g|png|gif)!Ui' , $string , $matches);
    

    这应该避免将来出现任何有趣的意外。

    【讨论】:

    • 谢谢,我总是在得到图片 url 后检查 mime :D
    • mimetype 是可以修改的标头。如果你想试试这个,请安装一个名为 TamperData 的 Firefox 插件。您可以在请愿书中看到该标头的值,并且可以更改它。这是一个很好的做法,但您还需要确保最终文件名以 .jpg 或正确的扩展名结尾。
    • 你不能只使用 exif_imagetype() 来检查一个有效的图像吗?
    • 我害怕,但不是。您可以获取一个随机 PNG 文件并附加到文件末尾: 然后运行脚本: 你会看到它返回 3,相当于: IMAGETYPE_PNG 如果你确认你存储到系统中的文件的扩展名是 PNG,那么你或多或少是安全的。但如果没有,如果该文件可从网络服务器访问,他们可能会在您的服务器中插入后门。
    【解决方案2】:
    $matches = array();
    preg_match_all('!http://.+\.(?:jpe?g|png|gif)!Ui' , $string , $matches);
    

    【讨论】:

    • 我认为你需要让它不贪婪:'!http://.+?\.(?:jpe?g|png|gif)!i'(注意后面的问号+) 否则它将在第一个 http:// 直到最后一个匹配的扩展名之间匹配。
    • @jeroen:你对贪婪的事情是正确的。我修好了它。 @Tom:任何给出空数组的 $string 示例? (我想解决必须修复的问题!)
    • Okidoki,我已经删除了我的答案,因为你应该这样做。
    • +1 如果您提供指向preg_match_all 文档的链接。;)
    【解决方案3】:

    更新有前缀http/https可选的情况,例如:

    http://example.com/image.jpg
    https://example.com/image.jpg
    //example.com/image.jpg
    
    function extractImageUrlFromText($text) {
      preg_match_all('!(https?:)?//\S+\.(?:jpe?g|jpg|png|gif)!Ui', 
      $text, $matches);
      return $matches[0];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-31
      相关资源
      最近更新 更多