21.3 PHP中的POSIX扩展正则表达式函数
正则表达式可用于复杂字符串的处理。仅仅了解什么是正则表达式和如何创建一个正则表达式,在实际应用中还是无法完成具体工作的。和其他解决问题的办法一样,PHP提供函数完成对正则表达式的支持。PHP有两大类函数支持正则表达式,一类是POSIX扩展函数,另一类是PERL兼容的正则表达式函数。本节先介绍POSIX扩展正则表达式函数。这些函数如下所述。
·函数ereg(),字符串的正则匹配函数。
·函数ereg_replace(),区分大小写的正则表达式替换。
·函数eregi(),不区分大小写的正则表达式匹配。
·函数eregi_replace(),不区分大小写的正则表达式替换。
·函数split(),用正则表达式将字符串分割到数组中。
·函数spliti(),用正则表达式不分字母大小写地将字符串分割到数组中。
·函数sql_regcase(),产生用于不区分大小的正则表达式。
21.3.1 正则表达式匹配函数
在PHP中完成对正则表达式是否匹配判断的函数是ereg()。该函数的原型如下。
int ereg (string $pattern, string $string [, array ®s])
该函数以区分大小写的方式,按参数$pattern(该参数是一个正则表达式)的规则来匹配字符串参数$string。匹配结果所返回的值放在第3个可选数组参数regs之中,regs[0]内容就是原字符串string,regs[1]为第一个合乎规则的字符串,regs[2]就是第2个合乎规则的字符串,以此类推。若调用该函数时省略参数regs,则只是单纯使用正则表达式做匹配。如果在string中找到pattern模式的匹配,那么该函数返回所匹配字符串的长度;如果没有传递入可选参数regs或者所匹配的字符串长度为0,则本函数返回1,如果没有找到匹配或出错,该函数返回FALSE。代码21-1演示了该函数的用法。
代码21-1 正则表达式匹配函数ereg的使用21-1.php
01 <?php 02 $arr_date = array( 03 '2008-06-01', 04 '2005-0x-10', 05 '12-12-12', 06 '2012-12-25 00:10:20', 07 '2011-12-05' 08 ); // 定义一个日期数组 09 10 for ($i=0; $i<5; ++$i) //5 次循环 11 { 12 $date = $arr_date[$i]; // 获取日期元素 13 if(ereg("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})", $date,$regs)) 14 { 15 echo " 日期字符串$date 符合'YYYY-MM-DD' 格式:"; 16 echo "$regs[1].$regs[2].$regs[3]<br/><br/>"; 17 } 18 else 19 { 20 echo "<b> 日期字符串$date 不符合'YYYY-MM-DD' 格式的日期字符串</b><br/><br/>"; 21 } 22 } 23 ?>
【代码解析】这段代码使用函数ereg(),通过传入原始字符串、一个正则表达式以及参数数组,完成对格式日期(YYYY-MM-DD)的匹配判断,如果匹配正则表达式([0-9]{4})-([0-9]{1,2})-([0-9]{1,2}),该程序会以DD.MM.YYYY格式显示出该日期。代码21-1的执行结果如图21-1所示。
图21-1 在程序中使用函数ereg
这里强调一点,函数ereg()对字符串的匹配是区分大小写的。函数eregi()在匹配字符串时是不区分大小写的语法如下。
int eregi (string $pattern, string $string [, array ®s])
通过这个语法可以看出,该函数的参数及返回值和函数ereg()完全一样,唯一的区别就是,该函数在匹配字母时是不区分大小写的。代码21-2演示了该函数的用法。
代码21-2 正则表达式匹配函数eregi()的用法21-2.php
01 <?php 02 $arr_str = array( 03 'Python', 04 'php', 05 'Perl', 06 'Ruby' 07 ); // 定义数组变量 08 09 for($i=0; $i<4; ++$i) //4 次循环 10 { 11 $str = $arr_str[$i]; // 获取当前数组元素 12 if(eregi('P|h', $str)) // 匹配指定字符串 13 { 14 echo "'$str' 含有P 、p 、H 或h<br/><br/>"; 15 } 16 else 17 { 18 echo "<b>'$str' 不含 P 、p 、H 或h</b><br/><br/>"; 19 } 20 21 if(ereg('P',$str)) // 匹配指定字符 22 { 23 echo " 在ereg() 中 '$str' 匹配'P|h'<br/><br/>"; 24 } 25 else 26 { 27 echo "<b> 在ereg() 中 '$str' 不匹配'P|h'</b><br/><br/>"; 28 } 29 } 30 ?>
【代码解析】代码分别使用了函数eregi()和ereg()来对字符串做正则表达式匹配。程序中,每次使用的字符串相同,正则表达式也相同,但因为函数ereg()区分大小写的缘故,所以同样的字符串匹配,会有和函数eregi()不同的数据结果。代码21-2的执行结果如图21-2所示。
21.3.2 替换匹配字符串的函数
替换匹配字符串的正则表达式函数有两个,一个是函数ereg_replace(),另一个是函数eregi_replace()。它们之间的区别是是否忽略匹配字母的大小写。函数ereg_replace()的语法如下。
string ereg_replace (string $pattern, string $replacement, string $string)
该函数在参数$string中扫描与参数$pattern匹配的部分,并将其用参数$replacement替换。该函数返回替换后的字符串。如果在参数$string中未找到匹配正则表达式的项,则参数$string将原样返回。注意,该函数在匹配字符串时,是区分大小写的。代码21-3演示了该函数的用法。
代码21-3 在程序中使用函数ereg_replace()替换匹配的字符串21-3.php
01 <?php 02 $str = "1fish2fish3fish4fish5fish"; // 定义字符串变量 03 echo "<b> 替换前字符串为:</b><br/>"; 04 echo $str; 05 echo "<br/>"; 06 echo "<br/>"; 07 08 $str_rpc = ereg_replace("[0-9]", " ", $str); // 替换匹配的字符串 09 echo "<b> 替换后字符串为:</b><br/>"; 10 echo $str_rpc; 11 ?>
【代码解析】 代码首先定义一个字符串“1fish2fish3fish4fish5fish”,然后将其中的数字都替换为空格。第08行在调用函数ereg_replace()时,传入正则表达式[0-9]作为分割符,所以函数ereg_replace()会将原字符串中所有的单个数字字符替换为空格。代码21-3的执行结果图21-3所示。
函数eregi_replace()也可以将匹配正则表达式的字符串加以替换,语法如下。
string eregi_replace (string $pattern, string $replacement, string $string)
函数eregi_replace()的用法和函数ereg_replace()完全一样,不同之处在于函数eregi_replace在做匹配时忽略字母的大小写。代码21-4是使用该函数的示例代码。
图21-2 在程序中使用函数eregi()
图21-3 在程序中使用函数ereg_replace()
代码21-4 在程序中使用eregi_repalce()替换匹配字符串21-4.php
01 <?php 02 $str = "You have a car, I have a Car, We have cARs!"; // 定义字符串变量 03 echo "<b> 替换前字符串为:</b><br/>"; 04 echo $str; 05 echo "<br/>"; 06 echo "<br/>"; 07 08 $pattern = "car"; // 要匹配的字符串 09 $replacement = "Apple"; // 替换后的字符串 10 $str_rpc = eregi_replace($pattern, $replacement, $str); 11 echo "<b> 替换后字符串为:</b><br/>"; 12 echo $str_rpc; 13 ?>
【代码解析】代码将字符串“You have a car,I have a Car,We have cARs!”中的car替换成Apple,因为使用的函数eregi_replace()是不区分大小写的,所以字符串Car和cAR也会被替换。代码21-4的执行结果如图21-4所示。
21.3.3 根据正则表达式分割字符串的函数
函数split()通过匹配正则表达式作为分割符,将字符串分割出各个字串,存入数组中,语法如下。
array split (string $pattern, string $string [, int $limit])
该函数的返回值是一个数组,其每个单元都是参数$string经正则表达式$pattern作为分割符分出的字符串。该函数第3个参数是可选参数,如果指定了参数$limit,则返回数组最多包含limit个单元,其中最后一个单元包含参数字符串$string剩余的部分。如果执行出现错误,函数split()返回FALSE。代码21-5演示了该函数的用法。
代码21-5 在程序中使用函数split()21-5.php
01 <?php 02 $str = "aaa ~bbb ~ccc ~ddd"; // 定义字符串变量 03 echo " 字符串截取前:$str"; 04 echo "<br/>"; 05 echo "<br/>"; 06 07 $sep_arr = split(" ~",$str); // 分割字符串变量$str 08 echo "<b> 字符串截取后:</b><br/>"; 09 echo "<pre>"; 10 11 print_r($sep_arr); 12 ?>
【代码解析】这段代码第07行使用函数split()按符号“~”分割字符串参数$str。这里的“~”实际是一个正则表达式,split按其模式来分割字符串参数$str,并将分割后的字符串存入数组返回。代码21-5的执行结果如图21-5所示。
图21-4 使用函数eregi_replace()进行字符串替换
图21-5 在程序中使用函数split()
代码21-5在调用函数split()时使用正则表达式并不明显,代码21-6更能体现正则表达式在函数split()中的使用。
代码21-6 函数split()的使用21-6.php
01 $str = "AAAaaaA ~BbbbC ~DcccE ~FdddZZZ"; // 定义字符串变量 02 echo "<b> 字符串截取前:</b><br/>$str"; 03 echo "<br/>"; 04 echo "<br/>"; 05 06 $sep_arr = split("[a-z]{3}",$str); // 分割字符串 07 echo "<b> 使用aaa ,bbb ,ccc ,ddd 做分割字符串后:</b>"; 08 echo "<pre>"; 09 10 print_r($sep_arr); 11 ?>
【代码解析】 在代码21-6中,传入函数split()作为分隔符的是一个正则表达式:[a-z]{3}。这是一个比较简单的正则表达式,它可以匹配任意3个小写字母。在即将被分割的字符串AAAaaaA~BbbbC~DcccE~FdddZZZ,该模式可以匹配aaa、bbb、ccc和ddd,所以原字符串通过函数split()按正则表达式[a-z]{3}所匹配的字符,被分割成5个部分AAA、A~B、C~D、E~F和ZZZ。这段代码的执行结果如图21-6所示。
21.3.4 生成正则表达式的函数
函数sql_regcase()可以产生用于不区分大小的正则表达式,语法如下。
string sql_regcase (string $string)
该函数返回与参数$string相匹配的正则表达式,该表达式以不区分大小写的形式返回。代码21-7演示了该函数的用法。
代码21-7 使用函数sql_regcase()生成正则表达式21-7.php
01 $str = "K#V3050"; // 定义字符串变量 02 echo "<b> 原字符串:</b><br/>$str"; 03 echo "<br/>"; 04 echo "<br/>"; 05 06 $reg_str = sql_regcase ($str); // 生成正则 07 echo "<b> 使用函数sql_regcase() 生成的正则表达式为:</b>"; 08 echo "<br/>"; 09 echo $reg_str; 10 ?>
【代码解析】这段代码的执行结果如图21-7所示。读者可以看到,由函数sql_regcase()生成的正则表达式还是很简陋的。从这个结果还可看出,返回的表达式只是将传入参数中的每个字母字符转换为方括号表达式,该方括号表达式包含了该字母的大小写形式,而其他字符保持不变。
图21-6 在函数split()中使用正则表达式
图21-7 使用函数sql_regcase()生成正则表达式
共有条评论 网友评论