15.4.2 返回与模式匹配的数组单元的正则表达式函数
从本小节开始讲述PERL兼容的正则表达式函数,这类函数中所使用的模式极其类似PERL语言。表达式应被包含在定界符中,如斜线(/)。这就是说,正则表达式作为参数传入这些函数时,需要将正则表达式限定在//之内。例如:/<\/\w+>/,而/href='(.*)'就不是一个合法的PERL兼容正则表达式,因为它缺少结束界定符/。任何不是字母、数字或左斜杠(\)的字符都可以作为界定符。如果作为界定符的字符必须被用在表达式本身中,则需要用反斜线转义。
第一个要介绍的是函数preg_grep(),该函数返回与模式匹配的数组元素。函数preg_grep()的语法如下所示。
array preg_grep(string$pattern,array$input[,int$flag])
该函数返回一个数组,其中包括了参数$input数组中与给定的参数$pattern模式相匹配的元素。第3个参数$flag是可选的,如果其传入值为PREG_GREP_INVERT,那么函数preg_grep()会返回输入数组中,不匹配给定pattern的单元。代码15-8演示了该函数的用法。
代码15-8 在程序中使用PERL兼容的正则表达式函数preg_grep()15-8.php
01 <?php
02 $test_preg=array(
03 "AK47",
04 "163.com",
05 "happy new year!",
06 "EX0000",
07 "007 in USA",
08 "abc123",
09 "TEST-abc-315",
10 "123654789",
11 "Euapa00!"
12 );//定义字符串数组
13
14 echo"<b>原数组:</b>";
15 echo"<pre>";
16 print_r($test_preg);
17 echo"</pre>";
18
19 $preg_arr=preg_grep("/^[A-Z].*[0-9]$/",$test_preg);//传入正则表达式给函数preg_grep()
20 echo"<br>";
21 echo"<b>将原数组中以任意大写字母开头的、中间任意个字符、最后以数字结尾的字符串找出:</b>";
22 echo"<pre>";
23 print_r($preg_arr);//输出匹配的元素
24 echo"</pre>";
25 ?>
【代码解析】这段代码从一个数组中找出一些元素,这些元素匹配以任意大写字母开头、中间含有任意个字符、最后以数字结尾。满足这样匹配的正则表达式可以是^[A-Z].*[0-9]$,因为这个表达式将要作为PERL兼容的正则表达式函数,因此需要在其前后加上界定符,如代码的第19行所示。所以,最终传入给函数preg_grep()的正则表达式参数是:/^[A-Z].*[0-9]$/。
函数preg_grep()会根据传入的正则表达式,匹配原数组中各单元的元素,将匹配正则表达式的元素值存入数组返回。代码15-8的执行结果如图15-8所示。
调用该函数时,如果可选的第3个参数的传入值为PREG_GREP_INVERT,那么该函数会将数组中不匹配模式的单元返回。例如,将代码15-8的第19行改为如下所示的代码。
$preg_arr=preg_grep("/^[A-Z].*[0-9]$/",$test_preg,PREG_GREP_INVERT);
然后将第21行的说明信息稍加修改,再执行代码15-8,就会看到如图15-9所示的结果。