小议php正则提取图片地址

发布时间:2020-02-13编辑:脚本学堂
本文介绍下,用php的正则提取页面中图片地址的方法,有需要的朋友参考下。

在html页面中,图片网址规范的html代码一般为:
<img src="囧1" title="囧2" alt="囧3" border="囧4" width="囧5" height="囧6" />
囧2和囧4是非必需的,若要通过XHTML认证囧1、囧3、囧5、囧6必不可少。
就正则谈正则的话,最短匹配为:
(?<=img.+?src=").*?(?=")

不过,这条在php中会报错:
Warning: preg_match_all() [function.preg-match-all]: Compilation failed: lookbehind assertion is not fixed length at offset *** in ***

问题在(?<=img.+?src=")这个零宽断言里,在php中,零宽断言里不支持类似“*”、“+”这些无限次的东西,于是报错了,把“.+?”改为定长就好。不过,要“img”和“src=”之间定长基本上是不可能的。通常,图片地址的img和src只会相隔一个很简单的空格,但不排除某些情况在src之前,img后有alt、titlte等东西。
所以
 

复制代码 代码示例:
(?<=img.src=").*?(?=")

(?<=imgssrc=").*?(?=")

单纯
(?<=src=").*?(?=")
不行吗?
通常情况,可以,但除了图片地址用src开头以外,javascript地址也用src开头!

把图片的后缀列出来,是否可以呢?例如:
 

复制代码 代码示例:
(?<=src=").*?.(jpg|jpeg|gif|png|bmp|JPG|JPEG|GIF|PNG|BMP)
 

你见过没有后缀的图片?jb200.com 有很多这样的例子
 

RAW http://us.jb200.com/content/media/images/Headers/15559182
SmackDown http://us.jb200.com/content/media/images/Headers/15854138
NXT http://us.jb200.com/content/media/images/Headers/15929136
Superstars http://us.jb200.com/content/media/images/Headers/15815850
 

上面的网址都是图片,但都没有传统后缀,遇到这样的地址,还是会束手无策。

此时,可以这样:
<img(.*?)src="(.*?)(?=")
这次的结果中array[0]的内容不是我们想要的,我们要的图片地址在array[2]里。
因为用了2个 (.*?),每个“()”的东西会自动存在一个组里,而array[0]代表结果的汇总,array[1]包含了img和src里的所有东西,array[2]才轮到我们想要的图片地址。这种匹配方法,既能匹配有传统后缀的图片,也能匹配一些无后缀的图片文件,同时又不会杀错其它src=文件。

有关php正则提取图片地址的建议:
如果图片地址的格式是img空格src=这种形式,请使用:(?<=img.src=").*?(?=") ,数组唯一。
否则,请使用<img(.*?)src="(.*?)(?=") ,记得留意有用内容所在的数组位置。

就介绍这些吧,写的有点乱,不过真的希望可以帮助大家理解php正则的用法。