6.3 PCRE兼容正则表达式函数

6.3 PCRE兼容正则表达式函数

视频讲解:光盘TMlx603 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****等),并保存到另一个数组中。实例代码如下:(实例位置:光盘TMsl61)

<?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,并返回各自的匹配次数。实例代码如下:(实例位置:光盘TMsl62)

<?php $str = 'This is an example! '; $preg = '/bw{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也当作特殊字符输出。实例代码如下:(实例位置:光盘TMsl63)

<?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能识别的标签。实例代码如下:(实例位置:光盘TMsl64)

<?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功能。实例代码如下:(实例位置:光盘TMsl65)

<?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()函数的使用方法相同,这里不再举例。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

微信扫一扫

微信扫一扫

微信扫一扫,分享到朋友圈

6.3 PCRE兼容正则表达式函数