在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等东西。
所以
单纯
(?<=src=").*?(?=")
不行吗?
通常情况,可以,但除了图片地址用src开头以外,javascript地址也用src开头!
把图片的后缀列出来,是否可以呢?例如:
你见过没有后缀的图片?jb200.com 有很多这样的例子
上面的网址都是图片,但都没有传统后缀,遇到这样的地址,还是会束手无策。
此时,可以这样:
<img(.*?)src="(.*?)(?=")
这次的结果中array[0]的内容不是我们想要的,我们要的图片地址在array[2]里。
因为用了2个 (.*?),每个“()”的东西会自动存在一个组里,而array[0]代表结果的汇总,array[1]包含了img和src里的所有东西,array[2]才轮到我们想要的图片地址。这种匹配方法,既能匹配有传统后缀的图片,也能匹配一些无后缀的图片文件,同时又不会杀错其它src=文件。
有关php正则提取图片地址的建议:
如果图片地址的格式是img空格src=这种形式,请使用:(?<=img.src=").*?(?=") ,数组唯一。
否则,请使用<img(.*?)src="(.*?)(?=") ,记得留意有用内容所在的数组位置。
就介绍这些吧,写的有点乱,不过真的希望可以帮助大家理解php正则的用法。