10.4 Perl兼容正则表达式函数
Perl兼容正则表达式简称PCRE(Perl Compatible Regular Expression)。Perl是一门语言,它的字符串处理功能非常强大,这里的PCRE就是使用了Perl的正则函数库。
在PCRE中,通常将正则表达式包含在两个反斜线“/”之间。实现该风格正则表达式的函数也有7个,使用“preg_”为前缀命名。Perl兼容正则表达式已被广泛地使用,下面列举了表单验证时常用到的几个表达式。
//验证邮箱 $pattern = "/^[\w-.]+@[\w-.]+(.\w+)+$/"; //验证手机号 $pattern = "/^\d{11}$/"; //验证是否是整数 $pattern = "/^\d+$/"; //验证是否是正整数 $pattern = "/^[1-9]\d+$/"; //验证邮编 $pattern = "/^\d{6}$/"; //验证IP地址 $pattern = "/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/"; //验证QQ号 $pattern = "/^[1-9]\d{4,15}$/"; //验证是否是数字(可以带小数点,也不管正负) $pattern = "/^[0-9.-] * [+]?[0-9.]+$/"; //验证是否是英文 $pattern = "/^[a-z]+$/i"; //验证是否是汉字 $pattern = "/^[\x80-\xff]+\$/"; //验证是否以http://或ftp://或https://开头 $pattern = "/^(http\:\/\/|ftp\:\/\/|https\:\/\/|\/)/i"; //验证URL是否合法 $pattern = "/^http:\/\/[A-Za-z0-9]+[A-Za-z0-9.]+\.[A-Za-z0-9]+\$/"; //验证身份证格式 $pattern = "/^(\d{14}[0-9X]|\d{17}[0-9X])$/";
10.4.1 对数组查询匹配函数——preg_grep()
语法形式如下。
array preg_grep ( string pattern, array input )
该函数返回一个数组,数组中包括input数组中与给定的pattern模式相匹配的元素。对于输入数组input中的每个元素,preg_grep()也只进行一次匹配。
例10-4 对数组进行查找匹配,代码如下。
<?php $preg = "/^[0-9]{6}$/"; //邮政编码表达式 $arr = array('300191' ,'123', '300200' , 'a21'); $preg_arr = preg_grep($preg , $arr); echo "<pre> "; var_dump($preg_arr); echo " </pre>"; ?>
运行结果输出,如图10-4所示。
10.4.2 字符串匹配函数preg_match()和preg_match_all()
语法形式如下。
int preg_match ( string pattern, string subject [, array matches [, int flags]] )
该函数在subject字符串中搜索与pattern给出的正则表达式相匹配的内容。如果给出了第三个参数matches,则将匹配结果存入该数组。$matches[0]将包含与整个模式匹配的文本,该函数只会进行一次匹配,最终返回0或1的匹配结果数。
如果需要一直搜索到subject的结尾处,则使用函数preg_match_all()。
例10-5 从url中取出域名,代码如下。
<?php $string = 'abcd1234efgh56789jklm9013'; //匹配出第一个符合表达式信息的即停止 preg_match("/\d{4}/",$string,$matchs); print_r($matchs); //输出结果为: Array ( [0] => 1234 ) //匹配出所有符合表达式信息的才会停止 preg_match_all("/\d{4}/",$string,$matchs); print_r($matchs); //输出结果为: Array ( [0] => Array ( [0] => 1234 [1] => 5678 [2] => 9013 ) ) ?>
10.4.3 转义特殊字符函数——preg_quote()
语法形式如下。
string preg_quote ( string str [, string delimiter] )
将以str为参数中的所有特殊字符进行自动转移,即自动加上一个反斜线“/”。如果需要以动态生成的字符串作为模式去匹配则可以用此函数转义其中可能包含的特殊字符。
如果提供了可选参数delimiter,该字符也将被转义。
正则表达式的特殊字符包括:. \\ + * ? [ ^ ] $ ( ) { } = ! < > | :。
例10-6 对字符串进行自动转义,代码如下。
<?php $name = "*HBSI.net"; $name = preg_quote($name , "net"); echo $name; //将输出 \*shop\nc\.\net ?>
运行结果如图10-5所示。
10.4.4 搜索和替换函数——preg_replace ()
语法形式如下。
mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit] )
在subject中搜索pattern模式的匹配项并替换为replacement。如果指定了limit,则仅替换limit个匹配项,如果省略limit或者其值为-1,则所有的匹配项都会被替换。
该函数和函数ereg_replace()的主要区别在于preg_replace()的每个参数(除了limit)都可以是一个数组,而函数ereg_replace()每个参数都只能是字符串。如果函数preg_replace()中pattern和replacement都是数组,将以其键名在数组中出现的顺序来进行处理。这不一定和索引的数字顺序相同。如果使用索引来标识哪个pattern将被哪个replacement来替换,应该在调用preg_replace()之前用ksort()对数组进行排序。
例10-7 对数组进行查找替换,代码如下。
<?php $string = "The quick brown fox jumped over the lazy dog."; $patterns[0] = "/quick/"; $patterns[1] = "/brown/"; $patterns[2] = "/fox/"; $replacements[2] = "bear"; $replacements[1] = "black"; $replacements[0] = "slow"; var_dump($string);echo "<br/>"; $str = preg_replace($patterns, $replacements, $string); var_dump($str);echo "<br/>"; ksort($patterns); ksort($replacements); $str = preg_replace($patterns, $replacements, $string); var_dump($str);echo "<br/>"; ?>
运行结果输出如图10-6所示。
10.4.5 字符串拆分函数——preg_split()
语法形式如下。
array preg_split ( string pattern, string subject [, int limit [, int flags]] )
该函数返回一个字符串数组,每个元素为subject经正则表达式pattern作为边界分割出的子串。如果设定了limit,则返回的数组最多包含limit个单元,而其中最后一个单元包含string中剩余的所有部分。该函数与split()用法相同,这里不再举例。