【问题标题】:PHP Get All URL's of Images From StringPHP从字符串中获取所有图像的URL
【发布时间】:2012-08-01 04:01:49
【问题描述】:

我需要一个用于 PHP 的函数或正则表达式字符串,我可以像这样传递一个字符串:

Lorem ipsum dolor sit amet,http://www.gettyimages.com/images/marketing/frontdoorStill/PanoramicImagesRM/FD_image.jpg consectetur adipiscing elit。 Nullam sed diam lectus,一个 rutrum orci。暂停潜力。 Nulla facilisi。暂停潜力。 Ut http://www.handsonuniverse.org/get_images/images/20090802.ngc6992.HOS.jpgullamcorper mauris sit amet elit tristique sat amet laoreet nunc condimentum。 Lorem ipsum dolor sit amet, consectetur adipiscing elit。 Aliquam euismod arcu non odio http://www.prelovac.com/vladimir/wp-content/uploads/2008/03/example.jpg aliquam 前庭。 sed eleifend tellus id augue luctus ac ultrices leo semper。

我会得到回报:

http://www.gettyimages.com/images/marketing/frontdoorStill/PanoramicImagesRM/FD_image.jpg http://www.handsonuniverse.org/get_images/images/20090802.ngc6992.HOS.jpg http://www.prelovac.com/vladimir/wp-content/uploads/2008/03/example.jpg

在一个数组中。我需要它来根据天气抓取 URL,它们是否包含常规图像扩展名,例如 *.jpg、*.png、*.bmp 等。任何人都知道存在这样的 URL,这样我就可以避免重新发明轮子?谢谢!

【问题讨论】:

    标签: php regex string image url


    【解决方案1】:

    如果您不想使用正则表达式执行此操作。相反,解析 HTML。

    <?php
    $html='YOUR_STRING';
    $dom = new domDocument; 
    $dom->loadHTML($html); 
    $dom->preserveWhiteSpace = false;
    $images = $dom->getElementsByTagName('img');
    
    foreach ($images as $image) 
       {   
         echo $image->getAttribute('src'); 
       }
    
    ?>
    

    【讨论】:

    • 太棒了。最佳答案。
    • 这只会识别 HTML 代码中的 &lt;img&gt; 标签。这不会识别任何背景图像、锚点 href 中的图像,或者按照 OP 的要求,识别出现在纯文本字符串中的图像 URI
    • @Philipp 是的。这仅适用于标签,不适用于 bg 图像。如果您需要做更多工作,请参考 domDocument
    【解决方案2】:

    好吧,下面将适用于您的示例:

    preg_match_all('/(https?:\/\/\S+\.(?:jpg|png|gif))\s+/', $content, $matches);
    

    添加您想要捕获的任何其他扩展。

    请注意,上述内容不一定是可靠的(例如,它不会匹配 www.blah.com/image.jpg)。它也不会匹配没有以扩展名结尾的 URL,即使它们是图像(即http://domain.com/blah.jpg?loadsmall=true 或其他东西)。有一些方法可以让它变得更智能,但这实际上取决于您期望什么样的输入,因为这将决定您的解析需要多么复杂。

    【讨论】:

    • 这已经足够完美了,我所做的只是尝试在人们复制粘贴链接时尽可能显示图像,谢谢!
    • 我可能会错过一些东西,但我无法让它工作:$content = 'http://www.gettyimages.com/images/marketing/frontdoorStill/PanoramicImagesRM/FD_image.jpg'; preg_match_all('/(https?:\/\/\S+\.(?:jpg|png|gif))\s+/', $content, $matches); print_r($matches); 演示:codepad.viper-7.com/bgAbt6
    • 我的代码旨在匹配一大块文本中的 URL(以 OP 描述的格式)。正如您所发现的,它不会匹配字符串末尾的 URL,因为结尾的 \s+ 在 URL 之后需要空格。
    【解决方案3】:

    这是正则表达式: /(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/g

    演示:http://regexr.com?31ni5

    功劳来自一些随机的 Google 结果。

    【讨论】:

    • 不起作用,好像 url 后面还有其他东西.. 比如
      或其他任何东西.. 我给你看:regexr.com?35lba
    猜你喜欢
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-07
    • 1970-01-01
    相关资源
    最近更新 更多