PHP正则匹配图片地址

在某项目中需要从文章内容中匹配多个图片,在实践的过程中掉进坑里爬了很久才出来。

最开始我使用的正则表达式如下:

<img.*?src=[\'|\"](.*?(?:[\.gif|\.jpg|\.png|\.jpeg]))[\'|\"].*?[\/]?>

 

然而使用这个正则表达式来匹配图片的话就会有一个缺陷,如果src里面的值不是一个标准的图片地址,那么很有可能就会匹配出错。比如下面的代码,内容中共有三个img标签,其中第二个img的src属性是http://image-demo.oss-cn-hangzhou.aliyuncs.com/example.jpg?x-oss-process=image/resize,m_fixed,h_100,w_100

<?php
$content = '<p>我是第一段</p><p>我是第二段图片前文字<img src="http://image-demo.oss-cn-hangzhou.aliyuncs.com/example.jpg" />我是第三段图片前文字<img src="http://image-demo.oss-cn-hangzhou.aliyuncs.com/example.jpg?x-oss-process=image/resize,m_fixed,h_100,w_100" /><img src="http://image-demo.oss-cn-hangzhou.aliyuncs.com/example.jpg" /></p><p>我是第四段文字</p>';

$image_pattern = "/<img.*?src=[\'|\"](.*?(?:[\.gif|\.jpg|\.png|\.jpeg]))[\'|\"].*?[\/]?>/";
preg_match_all( $image_pattern, $content, $matches );

var_dump( $matches );

 

执行结果如下,可以看到因为第二个img标签里面的src并不是一个预想的那样,导致匹配第二个img的时候直接把第三个img一起包含进来了。当然我这里只是举了一个阿里云oss图片处理地址,真实的情况里面可能还有更偏离预想的,比如可能干脆是一个错误的地址。

array(2) {
  [0]=>
  array(2) {
    [0]=>
    string(72) "<img src="http://image-demo.oss-cn-hangzhou.aliyuncs.com/example.jpg" />"
    [1]=>
    string(191) "<img src="http://image-demo.oss-cn-hangzhou.aliyuncs.com/example.jpg?x-oss-process=image/resize,m_fixed,h_100,w_100" /><img src="http://image-demo.oss-cn-hangzhou.aliyuncs.com/example.jpg" />"
  }
  [1]=>
  array(2) {
    [0]=>
    string(58) "http://image-demo.oss-cn-hangzhou.aliyuncs.com/example.jpg"
    [1]=>
    string(177) "http://image-demo.oss-cn-hangzhou.aliyuncs.com/example.jpg?x-oss-process=image/resize,m_fixed,h_100,w_100" /><img src="http://image-demo.oss-cn-hangzhou.aliyuncs.com/example.jpg"
  }
}

 

正确匹配图片地址的方法

指导思想:我们匹配的时候,不要限定图片路径格式,也就是不管图片的src属性值是合规还是不合规,先匹配出来,再处理。所以使用下面的正则表达式即可。

<img.*?src=[\'|\"](.*?)[\'|\"].*?[\/]?>

 

先把img标签里面的src值匹配出来,判断这个值是否合规,参考代码如下:

<?php
$content = '<p>我是第一段</p><p>我是第二段图片前文字<img src="http://image-demo.oss-cn-hangzhou.aliyuncs.com/example.jpg" />我是第三段图片前文字<img src="http://image-demo.oss-cn-hangzhou.aliyuncs.com/example.jpg?x-oss-process=image/resize,m_fixed,h_100,w_100" /><img src="http://image-demo.oss-cn-hangzhou.aliyuncs.com/example.jpg" /></p><p>我是第四段文字</p>';

$image_pattern = "/<img.*?src=[\'|\"](.*?)[\'|\"].*?[\/]?>/";
preg_match_all( $image_pattern, $content, $matches );

if( !empty( $matches[1]) ){
	//循环匹配到的src
	foreach ($matches[1] as $src) {
		$src_real = strtok($src,'?'); //分割,去掉请求参数
		$ext = pathinfo( $src_real, PATHINFO_EXTENSION ); //获取拓展名
		if( in_array( $ext, ['jpg','jpeg','gif','png'] ) ){
			echo $src_real.PHP_EOL;
		}
	}
}

 

输出结果符合要求,如下:

http://image-demo.oss-cn-hangzhou.aliyuncs.com/example.jpg
http://image-demo.oss-cn-hangzhou.aliyuncs.com/example.jpg
http://image-demo.oss-cn-hangzhou.aliyuncs.com/example.jpg

 

本文完,谢谢观赏。

请博主喝杯咖啡呢,谢谢^_^

如果本文“对您或有帮助”,欢迎随意打赏,以资鼓励继续创作!

原创文章《PHP正则匹配图片地址》,作者:笔者 徐哲钻石会员,未经允许不得转载。
转载或复制时,请注明出处:https://www.xuxiaokun.com/1652.html,本文由 Mr.xu 博客网 整理。
本站资源下载仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。

(2)
打赏 微信扫一扫赞赏 微信扫一扫赞赏 支付宝扫一扫赞赏 支付宝扫一扫赞赏
上一篇 2020年7月30日 23:12
下一篇 2020年8月13日 08:25

相关推荐

发表回复

登录后才能评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

笔者期待与您共勉 · 互赢

有言必答、商务合作、有偿服务

QQ:点击这里给我发消息

邮件:it@xuxiaokun.com

线上沟通时间 ↓↓↓:

周一至周五 9:30 - 17:30

其余时间Mail或QQ我,有言必应。

244439232