《序》
PHP水平的高低取决于多方面的积累,包括系统架构、模块设计、代码规范以及php的扩展啊等等,这些概念听起来可能有些泛泛,一时半会儿也说不清;但可以肯定的是要想成为高水平的PHPer,一定得熟练地掌握PHP函数,手册中对PHP函数的说明个人觉得有些生硬,所以我决定写PHP函数系列博文,希望和大家共勉。每晚一篇。
今天给大家带来PHP正则函数preg_match。php正则函数有两个种类:Perl风格的和POSIX风格。preg_match是perl风格的,函数名开始的p就是代表perl的,reg是regular的简写,match顾名思义吧。
函数原型:
<?php
preg_match ($pattern, $subject, array &$matches = null, $flags = null, $offset = null)
?>
参数注释:
$pattern //正则表达式字符串,格式为/^http{1,5}/i,写法跟JS正则表达式一样,正则的具体知识这里就不介绍了。
$subject //要搜索的字符串
$matches //要存放匹配结果,注意这个参数是引用类型,并给了默认值
$flags //
$offset //
返回值:
false ——当函数出错时
1 ——当匹配到结果时
0——未匹配到结果时
这里假设preg_match调用不出错,其实preg_match返回的是匹配结果数。大家知道一个字符串去匹配正则时可能有不只一个匹配结果,那为什么这个函数只返回0或1呢,这是因为preg_match找到一次匹配就终止搜索了。这就有点判断字符串中是否存在某某的意思?对了,就是这个意思,因为大家经常会碰到判断字符串中是否存在某某而不需要找出全部某某的情况,这个函数就是给你节省CPU和内存的。返回值1就是匹配到了,0就是未匹配到。
如果你需要把匹配的结果也取出来,那就传个数组给$matches,这个参数会把结果存起来,看个实例。
<?php
$url = "http://www.sina.com.cn/abc/de/fg.php?id=1";
$matches = array();//存放匹配结果
$pattern = '/\.{1}[^.|?]+\?{1}/i';
$count = preg_match($pattern, $url, $matches);
var_dump($count);
var_dump($matches);
?>
输出结果:
int 1
array (size=1)
0 => string '.php?' (length=5)
以上结果合你胃口不?合,对吧。
那么再给你看个不合胃口的例子。
<?php
$url = "http://www.sina.com.cn/abc/de/fg.php?id=1";
$matches = array();//存放匹配结果
$pattern = '/(\.){1}[^.|?]+(\?){1}/i';
$count = preg_match($pattern, $url, $matches);
var_dump($count);
var_dump($matches);
?>
猜猜会输出什么。
告诉你吧,输出是这样的。
int 1
array (size=3)
0 => string '.php?' (length=5)
1 => string '.' (length=1)
2 => string '?' (length=1)
为什么?是不是觉着不可思议了,返回值是1,数组里却存着3个结果。
对比下两段代码有什么差异,会发现只是两段代码的$pattern表面上不一样,请注意“表面上”这个用词;确实,只是表面上不一样,实际功能是一样的;不信的话用正则工具测一下。那为什么$matches数组里放的东西不一样?
进一步来说明下preg_match的匹配模式:
preg_match以匹配$pattern为主要功能,未匹配成功返回0,$matches为空数组;匹配成功返回1,$matches[0]存放匹配的结果。
如果$pattern中包含了()这种原子性的元字符,那么preg_match会视()中的字符串为子正则,比如/(\.){1}[^.|?]+(\?){1}/i 中的子正则有两个,分别是(\.){1}和(\?){1},$matches[1]会存放(\.){1}匹配的结果,$matches[2]会存放(\?){1}匹配的结果;如果包含多个子正则的话,依次类推,注意,每个子正则也只匹配一次。明白了吧!
$flags和$offset这两个参数用的情况不多,暂时就不说了,有需要再补充说明。
还有一点要说明,如果判断字符串中是否包含确定的子字符串,请使用字符串处理函数strstr。比如说要匹配ppp,就没必要使用preg_match('/ppp/','abcdpppfda'),直接使用strstr('ppp','abcdpppfda')就可以了,这样更高效。