正则表达式preg_replace在字符串中使用img属性查找图像

时间:2013-12-06 16:02:25

标签: php regex preg-replace

我正在尝试使用正则表达式在我的博文中找到所有图片。如果代码是干净的,并且SRC标记紧跟在IMG标记之后,下面的代码将返回图像。但是,我还有其他属性的图像,如高度和宽度。我的正则表达式并没有选择那个...任何想法?

以下代码返回如下所示的图像:

<img src="blah_blah_blah.jpg">

但不是看起来像这样的图像:

<img width="290" height="290" src="blah_blah_blah.jpg">

这是我的代码

$pattern = '/<img\s+src="([^"]+)"[^>]+>/i';

preg_match($pattern, $data, $matches);

echo $matches[1];

5 个答案:

答案 0 :(得分:4)

使用DOM或其他解析器,不要尝试使用正则表达式解析HTML。

$html = <<<DATA
<img width="290" height="290" src="blah.jpg">
<img src="blah_blah_blah.jpg">
DATA;

$doc = new DOMDocument();
$doc->loadHTML($html); // load the html

$xpath = new DOMXPath($doc);
$imgs  = $xpath->query('//img');

foreach ($imgs as $img) {
   echo $img->getAttribute('src') . "\n";
}

输出

blah.jpg
blah_blah_blah.jpg

答案 1 :(得分:3)

有没有想过使用DOM对象而不是正则表达式?

$doc = new DOMDocument();
$doc->loadHTML('<img src="http://example.com/img/image.jpg" ... />');
$imageTags = $doc->getElementsByTagName('img');

foreach($imageTags as $tag) {
    echo $tag->getAttribute('src');
}

答案 2 :(得分:1)

你最好使用解析器,但这是一种与regex有关的方法:

$pattern = '/<img\s.*?src="([^"]+)"/i';

答案 3 :(得分:1)

问题是您只能在\s+之后接受<img。试试这个:

$pattern = '/<img\s+[^>]*?src="([^"]+)"[^>]+>/i';

preg_match($pattern, $data, $matches);

echo $matches[1];

答案 4 :(得分:1)

试试这个:

$pattern = '/<img\s.*?src=["\']([^"\']+)["\']/i';

单引号或双引号以及动态src attr位置。