【转】小谈php正则提取图片地点

迷上了正则,不绝实验着新幻术,首先感激TNA 的非完全输出RSS,然后再次感激SH的强迫性进修。没有TNA,我不会去看正则,更不知道世界上有种这么牛的表达式;不是SH的死活说他不懂不知道,我也不会硬着头皮去琢磨,去改造。到达同一个目标,正则的表达方法可以不独一,没有做不到,只有你没想到。可以这样说吧,正则就是玩设定纪律,我大爱这种对象。没有比设定纪律筛选对象更让我欢快、感想awesome的了。

分享一下在php情况下利用正则提取图片地点的一些小心得:

图片网址类型的html代码无非就是

<img src="http://enenba.com/囧1" title="囧2" alt="囧3" />

囧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=").*?(?=")

(?<=img\ssrc=").*?(?=")

大概可以,但不担保100%没问题。

你也许会问,纯真

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

不可吗?凡是环境,可以,但,搜索过页面的盆友应该知道,除了图片地点用src开头以外,javascript地点也用src开头!并且,太多神通宽大的不行预知因素隐含个中,于是这个貌似很简短完美的写法就行不通了。
你又或者会问,智慧简短的不可,我把图片的后缀列出来,总该可以了吧,如

(?<=src=").*?\.(jpg|jpeg|gif|png|bmp|JPG|JPEG|GIF|PNG|BMP)

简直,这个写法实在是很诚恳,不外,你见过没有后缀的图片?wwe.com 有许多这种例子呢

RAW
SmackDown
NXT
Superstars

上面的网址都是图片,但都没有传统后缀,你诚恳也没用,照旧不能获取到它们。

怎么办呢?还可以这样

<img(.*?)src="(.*?)(?=")

和上面的表达式差异,这次的功效中array[0]的内容不是我们想要的,我们要的图片地点在array[2]里。为什么呢?因为我们用了2个 (.*?),每个“()”的对象会自动存在一个组里,而array[0]代表功效的汇总,array[1]包括了img和src里的所有对象,array[2]才轮到我们想要的图片地点。这种匹配要领,既能匹配有传统后缀的图片,也能匹配一些无后缀的图片文件,同时又不会杀错其它src=文件。小我私家感受照旧不错的,呵呵。虽然了,假如你尚有更好的发起,请顿时留言,全球人民城市感激你!
你到底要什么样的图片,是牢靠名目照旧其它?得详细环境详细阐明呢。
我的发起是:
假如你要的图片地点的名目是img空格src=的,请利用:(?<=img.src=").*?(?=") ,数组独一,你懂的。
不然,请利用<img(.*?)src="(.*?)(?=") ,记得寄望有用内容地址的数组位置哦!

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/7882.html