- 加入我的QQ群
- 关注我的百家号
扫描下面的二维码,“关注”我的百家号。
前面我们介绍了php正则表达式最基础的元素,可以实现简单的匹配。但是,对于一些比较复杂的,只这些是不够的。今天,我们接着往下讲,在一些复杂的匹配中,我们会用到“分组、懒惰和贪婪。那么,什么是分组、懒惰、贪婪呢?下面一起来看看。
一、分组:
使用小括号分开正则规则,每一个小括号就是一个分组,每个分组会自动拥有一个组号。从左向右1、2、3...如:
/([\w\.\_]{2,10})@(\w{1,}).([a-z]{2,4})/
二、?: 匹配但不捕获匹配的文本,也不给此分组分配组号(分组中会用到)
如:(X)中的X会被作为新增的一个组序号输出,比如(A)(B),A的序号1,B的序号2;
如果(?:A)(B),A将没有序号不输出,B的序号为1
三、懒惰与贪婪:
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复
.*? 这里的? 表示懒惰模式,不贪婪向后。(.+?)是同理。 如下例:
$str='<p><img src="up/07/12.jpg" alt=""/></p><p><img src="file/5.php" alt=""/></p>';
$pattern="/src=\"(.*?)\"/";
preg_match_all($pattern,$str,$match);
print_r($match);
打印结果:
Array(
[0] => Array( [0] => src="up/07/12.jpg", [1] => src="file/5.php" )
[1] => Array( [0] => up/07/12.jpg, [1] => file/5.php )
)
如果去掉? 改成 $pattern="/src=\"(.*)\"/";
打印结果:
Array(
[0] => Array( [0] => src="up/07/12.jpg" alt=""/></p><p><img src="file/5.php" alt="")
[1] => Array ([0] => up/07/12.jpg" alt=""/></p><p><img src="file/5.php" alt=")
)
可见,使用?后,每一次都是匹配到最近的1个双引号就结束,再进行下一次这样的匹配,如此循环;
而去掉?后,就会贪婪匹配,一直匹配到最后1个双引号,只会匹配一次