PHP从入门到精通(第4版)(软件开发视频大讲堂)
上QQ阅读APP看书,第一时间看更新

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