6.3 PCRE兼容正则表达式函数
视频讲解:光盘\TM\lx\6\03 PCRE兼容正则表达式函数.mp4
PHP中提供了两套支持正则表达式的函数库,但是由于PCRE函数库在执行效率上要略优于POSIX函数库,所以这里只讲解PCRE函数库中的函数。实现PCRE风格的正则表达式的函数有7个,下面就来了解一下这7个PCRE函数。
6.3.1 preg_grep()函数
函数语法:
array preg_grep ( string pattern, array input )
函数功能:使用数组input中的元素一一匹配表达式pattern,最后返回由所有相匹配的元素所组成的数组。
【例6.1】在数组$arr中匹配具有正确格式的电话号(010-1234****等),并保存到另一个数组中。实例代码如下:(实例位置:光盘\TM\sl\6\1)
<?php $preg='/\d{3,4}-? \d{7,8}/'; //国内电话格式表达式 $arr=array('043212345678', '0431-7654321', '12345678'); //包含元素的数组 $preg_arr=preg_grep($preg, $arr); //使用preg_grep()查找匹配元素 var_dump($preg_arr); //查看新数组结构 ?>
运行结果如图6.1所示。
图6.1 preg_grep()函数
6.3.2 preg_match()和preg_match_all()函数
函数语法:
int preg_match/preg_match_all ( string pattern, string subject [, array matches] )
函数功能:在字符串subject中匹配表达式pattern。函数返回匹配的次数。如果有数组matches,那么每次匹配的结果都将被存储到数组matches中。
函数preg_match()的返回值是0或1。因为该函数在匹配成功后就停止继续查找了。而preg_match_all()函数则会一直匹配到最后才会停止。参数array matches对于preg_match_all()函数是必须有的,而对前者则可以省略。
【例6.2】使用preg_match()函数和preg_match_all()函数来匹配字串$str,并返回各自的匹配次数。实例代码如下:(实例位置:光盘\TM\sl\6\2)
<?php $str = 'This is an example! '; $preg = '/\b\w{2}\b/'; $num1 = preg_match($preg, $str, $str1); echo $num1.'<br>'; var_dump($str1); $num2 = preg_match_all($preg, $str, $str2); echo '<p>'.$num2.'<br>'; var_dump($str2); ?>
运行结果如图6.2所示。
图6.2 preg_match()和preg_match_all()函数
6.3.3 preg_quote()函数
函数语法:
string preg_quote ( string str [, string delimiter] )
函数功能:该函数将字符串str中的所有特殊字符进行自动转义。如果有参数delimiter,那么该参数所包含的字串也将被转义。函数返回转义后的字串。
【例6.3】输出常用的特殊字符,并且将字母b也当作特殊字符输出。实例代码如下:(实例位置:光盘\TM\sl\6\3)
<?php $str = '! 、$、^、*、+、.、[、]、\\、/、b、<、>'; $str2 = 'b'; $match_one = preg_quote($str, $str2); echo $match_one; ?>
结果为:\! 、\$、\^、\*、\+、\.、\[、\]、\\、/、\b、\<、\>
注意
这里的特殊字符是指正则表达式中具有一定意义的元字符,其他如“@”“#”等则不会被当作特殊字符处理。
6.3.4 preg_replace()函数
函数语法:
mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit] )
函数功能:该函数在字符串subject中匹配表达式pattern,并将匹配项替换成字串replacement。如果有参数limit,则替换limit次。
说明
如果参数中调用的是数组,有可能在调用过程中并不是按照数组的key值进行替换,所以在调用之前需要使用ksort()函数对数组重新排列。
【例6.4】本例实现一个常见的UBB代码转换功能,将输入的“[b]…[/b]”“[i]…[/i]”等类似的格式转换为HTML能识别的标签。实例代码如下:(实例位置:光盘\TM\sl\6\4)
<?php $string = '[b]粗体字[/b]'; $b_rst = preg_replace('/\[b\](.*)\[\/b\]/i', '<b>$1</b>', $string); echo $b_rst; ?>
结果为:粗体字
说明
preg_replace()函数中的字串“$1”是在正则表达式外调用分组,按照$1、$2排列,依次表示从左到右的分组顺序,也就是括号顺序。$0表示的是整个正则表达式的匹配值。关于反向引用的其他用法,请参考6.2.12节。
6.3.5 preg_replace_callback()函数
函数语法:
mixed preg_replace_callback ( mixed pattern, callback callback, mixed subject [, int limit] )
preg_replace_callback()函数与preg_replace()函数的功能相同,都用于查找和替换字串。不同的是,preg_replace_callback()函数使用一个回调函数(callback)来代替replacement参数。
注意
在preg_replace_callback()函数的回调函数中,字符串使用“''”,这样可以保证字符串中的特殊符号不被转义。
【例6.5】本例使用回调函数来实现UBB功能。实例代码如下:(实例位置:光盘\TM\sl\6\5)
<?php function c_back($str){ $str = "<font color=$str[1]>$str[2]</font>"; return $str; } $string = '[color=blue]字体颜色[/color]'; echo preg_replace_callback('/\[color=(.*)\](.*)\[\/color\]/U', "c_back", $string); ?>
结果为:字体颜色
注意
本例运行结果“字体颜色”为蓝色字体,书中看不出效果,请运行本书光盘附带的实例。
6.3.6 preg_split()函数
函数语法:
array preg_split ( string pattern, string subject [, int limit ] )
函数功能:使用表达式pattern来分割字符串subject。如果有参数limit,那么数组最多有limit个元素。该函数与ereg_split()函数的使用方法相同,这里不再举例。