首页 > php代码 > PHP正则实战之匹配图片地址程序代码

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

段一,匹配地址方法

内容:

<a href="/item/2864756" target="_blank"><img src="/pic/r/e6/14/28b4766b65373ae6a3b3faccc81f_400_536.jpg" height="268" width="200px"/></a>
<a href="/item/2864756" target="_blank"><img src="/pic/r/e6/14/28b4766b65373ae6a3b3faccc81f_400_536.jpg" height="268" width="200px"/></a>
<a href="/item/2864756" target="_blank"><img src="/pic/r/e6/14/28b4766b65373ae6a3b3faccc81f_400_536.jpg" height="268" width="200px"/></a>

PHP代码:

$p = "/src=\"([^\"]+)/isu";
//$p = "/<[^>]+>/isu";
//$p = "/<a[^>]+>/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('/(<img[^>]+src\s*=\s*"?([^>"\s]+)"?[^>]*>)/im', "<a href="$2&Prime;>$1</a>', $newstext);

1.preg_replace和str_replace的区别:

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

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

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

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

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


本文地址:http://www.phprm.com/code/62629.html

转载随意,但请附上文章地址:-)

标签:preg_match

相关文章

发表留言