迷上了正则,不绝实验着新幻术,首先感激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开头!并且,太多神通宽大的不行预知因素隐含个中,于是这个貌似很简短完美的写法就行不通了。
你又或者会问,智慧简短的不可,我把图片的后缀列出来,总该可以了吧,如
简直,这个写法实在是很诚恳,不外,你见过没有后缀的图片?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="(.*?)(?=") ,记得寄望有用内容地址的数组位置哦!