使用PHP从字符串中检索所有图像路径

时间:2018-01-25 18:53:43

标签: php regex

如何从字符串中获取所有图像路径? 注意我只想要包含单词“media”的路径。

例如,给定此字符串(DOM的一部分)

<div class="my-class">
   <img src="http://my-website.com/cache/media/2017/10/img67.jpeg" class="" alt="test" width="120" height="100">
   <img src="http://my-website.com/cache/2017/10/img68.png" class="" alt="test" width="120" height="100">
   <img src="http://my-website.com/cache/media/2017/10/img69.jpg" class="" alt="test" width="120" height="100">
   <h2 class="uk-margin-top-remove">About us</h2>                
</div>

我想要一个包含类似结果的数组:

array(
  [0] => "http://my-website.com/cache/media/2017/10/img67.png"
  [1] => "http://my-website.com/cache/media/2017/10/img69.png"
);

我不想要第二个img,因为src属性不包含单词“media”。

2 个答案:

答案 0 :(得分:2)

您可以使用preg_match_all()来获取网址,但使用DOM阅读器会更好。

$str = '<div class="my-class">
   <img src="http://my-website.com/cache/media/2017/10/img67.jpeg" class="" alt="test" width="120" height="100">
   <img src="http://my-website.com/cache/2017/10/img68.png" class="" alt="test" width="120" height="100">
   <img src="http://my-website.com/cache/media/2017/10/img69.jpg" class="" alt="test" width="120" height="100">
   <h2 class="uk-margin-top-remove">About us</h2>                
</div>' ;

$matches = [] ;
preg_match_all('~(http\://my-website\.com/cache/media/(.*?))"~i', $str, $matches) ;
var_dump($matches[1]);

将返回:

array(2) {
  [0]=>
  string(52) "http://my-website.com/cache/media/2017/10/img67.jpeg"
  [1]=>
  string(51) "http://my-website.com/cache/media/2017/10/img69.jpg"
}

答案 1 :(得分:1)

一些样板代码可以帮助您入门:

<?php

$data = <<<DATA
<div class="my-class">
   <img src="http://my-website.com/cache/media/2017/10/img67.jpeg" class="" alt="test" width="120" height="100">
   <img src="http://my-website.com/cache/2017/10/img68.png" class="" alt="test" width="120" height="100">
   <img src="http://my-website.com/cache/media/2017/10/img69.jpg" class="" alt="test" width="120" height="100">
   <h2 class="uk-margin-top-remove">About us</h2>                
</div>
DATA;

# set up the dom
$dom = new DOMDocument();
$dom->loadHTML($data, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);# | LIBXML_COMPACT | LIBXML_NOENT );

# set up the xpath
$xpath = new DOMXPath($dom);

foreach ($xpath->query("//img[contains(@src, '/media/')]/@src") as $image) {
    echo $image->nodeValue . "\n";
}

哪个收益

http://my-website.com/cache/media/2017/10/img67.jpeg
http://my-website.com/cache/media/2017/10/img69.jpg

<小时/> 这会加载DOM并对我们之后循环的每个图片使用xpath查询。 如果由于某些原因(为什么?)您无法使用DOM解析器,您可以使用第二个选项:

<img
(?s:(?!>).)+?
src=(['"])
(?P<src>(?:(?!\1).)+?/media/.*?\1)

使用src群组,请参阅a demo on regex101.com