【问题标题】:Using preg_match_all to extract all image links on a webpage使用 preg_match_all 提取网页上的所有图片链接
【发布时间】:2014-03-17 12:26:45
【问题描述】:

我在 preg_match_all 函数中遇到了这种模式 - "/([a-z-_0-9/\:.]*.(jpg|jpeg|png))/i" 的问题。诚然,我的正则表达式有点弱,所以我怀疑里面有问题。

这是我目前拥有的 -

preg_match_all("/([a-z\-_0-9\/\:\.]*\.(jpg|jpeg|png))/i", $raw, $matching)

$raw 只是这个页面的 HTML - http://www.topshop.com/webapp/wcs/stores/servlet/ProductDisplay?beginIndex=0&viewAllFlag=&catalogId=33057&storeId=12556&productId=13936776&langId=-1&categoryId=&parent_category_rn=&searchTerm=TS05K01FBLC&resultCount=1&geoip=home

页面上有一堆图像没有被拉入,我得到的只是以下($matching 数组的 [0] - 其余的是不同格式的重复数据)

array(8) {
    [0]=>
    string(77) "http://media.topshop.com/wcsstore/TopShop/images/catalog/05K01FBLC_normal.jpg"
    [1]=>
    string(143) "/wcsstore/ConsumerDirectStorefrontAssetStore/images/colors/color7/cms/pages/static/static-0000067510/images/tact-wk24-LFWshipping_UK-ROW-EU.jpg"
    [2]=>
    string(76) "http://media.topshop.com/wcsstore/TopShop/images/catalog/05K01FBLC_large.jpg"
    [3]=>
    string(77) "http://media.topshop.com/wcsstore/TopShop/images/catalog/05K01FBLC_normal.jpg"
    [4]=>
    string(40) "//assets.pinterest.com/images/PinExt.png"
    [5]=>
    string(41) "http://platform.tumblr.com/v1/share_4.png"
    [6]=>
    string(163) "http://media.topshop.com/wcsstore/ConsumerDirectStorefrontAssetStore/images/colors/color7/cms/pages/static/static-0000067528/images/PDP-wk24-LFWshipping_ROW-EU.jpg"
    [7]=>
    string(119) "/wcsstore/ConsumerDirectStorefrontAssetStore/images/colors/color7/cms/pages/static/static-0000008560/images/onthego.png"
  }

如果有人能告诉我一些信息,为什么这不是拉入页面上的每张图片,而只是这 8 张图片?

正则表达式中有什么东西限制了我得到的东西吗?

我没有收到这个 jpg 链接 - http://media.topshop.com/wcsstore/TopShop/images/catalog/05K01FBLC_3_large.jpg - 即使它在页面上

任何帮助将不胜感激。

格雷格

【问题讨论】:

  • 正则表达式是解析html的不好方法,尝试使用DOMDocument代替-> stackoverflow.com/questions/15895773/…
  • 该 jpg 不再出现在页面上。我得到了 25 张带有下一个正则表达式的图像:preg_match_all("/(?<='|\")[^'\"]+(jpg|jpeg|png)(?='|\"|\?)/i", $raw, $matching); gif 是否出于目的而跳过?
  • Your regex is fine mostly — 基本上归结为 Crisp 提到的内容。
  • 是的,您的正则表达式似乎正在工作。它会拾取 25 张图像,如果添加 .gif,它会拾取 36 张图像。
  • 大家好,我故意跳过 Gif - 只是因为相关图像是 jpg。那么也许 preg_match_all 没有拉入正确的数量。我将查看 DOMDocument - 但这不只是让您找到查找 IMG 标记吗?我想要所有指向提到的图像扩展名的 URL。谢谢您的帮助。 :-)

标签: php regex image preg-match-all


【解决方案1】:

我使用了这个,还从页面中获得了 25 张图片,因为 MElliott 放入了他从您那里获得的 cmets。

preg_match_all('/([-a-z0-9_\/:.]+\.(jpg|jpeg|png))/i', $raw, $matches);

print "<pre>"; print_r($matches[0]); print "</pre>";

我唯一要提到的是,您不需要转义字符类中的所有字符 - 只需转义正斜杠,因为它是您使用的分隔符。此外,您应该在字符类之后使用加号 + 而不是星号 *,以确保图像名称中至少包含一个字符。

【讨论】:

    猜你喜欢
    • 2012-07-06
    • 1970-01-01
    • 2014-01-30
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多