【php正则表达式】PHP正则实战之匹配图片地址程序代码

更新时间:2019-06-10    来源:php正则表达式    手机版     字体:

【www.bbyears.com--php正则表达式】

图片网址规范的html代码无非就是

《img title="??" src="/wp-admin/%E5%9B%A73" alt="??" title="??" width="5" height="6" /》

??和??是非必需的,若要通过XHTML认证??、??、??必不可少,??是核心内容,当然就不能少了。

就正则谈正则的话,我写出的最短匹配是

(?<=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 有很多这种例子呢

段一,匹配地址方法

内容:

 代码如下



PHP代码:

$p = "/src=\"([^\"]+)/isu";
//$p = "/<[^>]+>/isu";
//$p = "/]+>/isu";
preg_match_all($p, $html, $m);
var_dump($m);

结果:

Array
(
    [0] => Array
        (
            [0] => src="/pic/r/e6/14/28b4766b65373ae6a3b3faccc81f_400_536.jpg
            [1] => src="/pic/r/e6/14/28b4766b65373ae6a3b3faccc81f_400_536.jpg
            [2] => src="/pic/r/e6/14/28b4766b65373ae6a3b3faccc81f_400_536.jpg
          
 
    [1] => Array
        (
            [0] => /pic/r/e6/14/28b4766b65373ae6a3b3faccc81f_400_536.jpg
            [1] => /pic/r/e6/14/28b4766b65373ae6a3b3faccc81f_400_536.jpg
            [2] => /pic/r/e6/14/28b4766b65373ae6a3b3faccc81f_400_536.jpg
          
        )
 
)

段二,

 代码如下

newstext=preg_replace(preg_replace("/(]+src\s*=\s*”?([^>"\s]+)”?[^>]*>)/im", ‘$1", $newstext);

1.preg_replace和str_replace的区别:

str_replace只是纯字符替换,而preg_replace才是正则替换

2.$0,$1,$2等的说明:

$0指的是被整个模式所匹配的文本;

$1指的是首个 ( ) 引用的串;

$2指的是第二个()引用的串; 以此类推。

本文来源:http://www.bbyears.com/jiaocheng/53975.html

热门标签

更多>>

本类排行