文章教程

15.5几例常见正则表达式分析

9/17/2020 9:26:54 PM 人评论 次浏览

15.5 几例常见正则表达式分析

前面4节讲述了正则表达式的基本概念、正则表达式常用字符分类、PHP中POSIX扩展正则表达式函数及兼容PERL的正则表达式函数。正则表达式这些看似“怪异”的语法,有时的确会让读者感到困惑,尤其对初学者来说,那类似天书一般的正则表达式代码更是让人望而却步、无所适从。

无论怎样,要想掌握并且熟练使用正则表达式,肯定是需要一个渐进过程的。这个过程是一个需要大量实践和积累的过程,还需要一些毅力、耐力和信心。本节就通过几个完整而且具体的正则表达式实例,让读者进一步学习、理解和应用正则表达式。

15.5.1 检查IP地址的正则表达式

IP地址由句点“.”分割的几部分数字字符串组成,例如192.0.170.10。其通用形式是xxx.xxx.xxx.xxx,这里的xxx整数范围是0到255。因此IP地址中由“.”分割的每个数字串,至少有一个数字、至多有3个数字。既然xxx都是数字,那么首先考虑到的正则表达式[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}。因为[0-9]{1,3}完全可能匹配256、515和999等字符串,所以这个正则表达式并不能保证IP地址的每个数字部分都不超过255。为了便于理解,对IP地址数字部分是否超过255的判断,将通过一个简单的比较表达式来完成。代码15-13是匹配IP地址正则表达式的第1个版本,先看看它是否起作用。

代码15-13 检查IP地址的正则表达式(一)15-13.php


01 <?php

02 $arr_ip=array(

03 "127.0.0.1",

04 "218.206.10.123",

05 "192.221.515.0",

06 "123.0.0.0.1",

07 "-12.255.0.10",

08 "10.9c.132.69",

09 "255.10.10.255"

10 );//定义一个数组,包含一些IP地址

11

12 foreach($arr_ip as$ip)//遍历数组中的IP

13 {

14 if(validateIp($ip))//验证IP

15 {

16 echo"<b>$ip是正确的IP地址</b>";

17 echo"<br/><br/>";

18 }

19 else

20 {

21 echo"$ip不是正确的IP地址";

22 echo"<br/><br/>";

23 }

24 }

25

26 function validateIp($ip)//验证IP的函数

27 {

28 $iparray=explode(".",$ip);

29 for($i=0;$i<count($iparray);$i++)

30 {

31 if($iparray[$i]>255)

32 return(0);

33 }

34 return ereg("[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}",$ip);

35 }

36 ?>


【代码解析】在这段代码中,将对IP地址的检查放到函数validateIp()中完成,这个函数由两部分组成:一是判断IP地址的每个数字部分是否超过255,对于每个数字部分都不超过255的表达式才做进一步判断;二是将最后的匹配由函数ereg()完成。自定义函数最后将正则表达式函数ereg()的返回值返回。执行代码15-13,可以看到如图15-15所示的结果。

图 15-15 检查IP地址的结果

从这个执行结果看到,有的IP地址得到了正确的匹配,但有些错误的IP地址也被认为是合法的IP地址了,例如123.0.0.0.1和-12.255.0.10都是不正确的IP地址格式,但在代码15-13中被认为是正确的。

这个问题的原因就出在正则表达式上,再仔细研究一下程序中使用的正则表达式:[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3},可以看出123.0.0.0.1的一部分完全匹配这个正则表达式,例如123.0.0.0这部分就匹配程序中给定的正则表达式,所以才会出现将123.0.0.0.1认为是合法IP地址格式的问题。同样的道理,-12.255.0.10也可以匹配程序中给定的正则表达式。

知道了原因所在,就好解决这个问题。代码15-14是检查IP地址格式是否合法的第2个版本程序。

代码15-14 检查IP地址的正则表达式(二)15-14.php


01 <?php

02 $arr_ip=array(

03 "127.0.0.1",

04 "218.206.10.123",

05 "192.221.515.0",

06 "123.0.0.0.1",

07 "-12.255.0.10",

08 "10.9c.132.69",

09 "255.10.10.255"

10 );//定义一个数组,包含一些IP地址

11

12 foreach($arr_ip as$ip)//遍历IP数组

13 {

14 if(validateIp($ip))//验证IP

15 {

16 echo"<b>$ip是正确的IP地址</b>";

17 echo"<br/><br/>";

18 }

19 else

20 {

21 echo"$ip不是正确的IP地址";

22 echo"<br/><br/>";

23 }

24 }

25

26 function validateIp($ip)//验证IP的函数

27 {

28 $iparray=explode(".",$ip);

29 for($i=0;$i<count($iparray);$i++)

30 {

31 if($iparray[$i]>255)

32 return(0);

33 }

34 return ereg("^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$",$ip);//正则表达式

35 }

36 ?>


【代码解析】这段程序将原来的正则表达式改为:^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$,通过在原正则表达式开头加^、结尾加$,保证了正则表达式只能匹配由.连接的4段数字字符。代码15-14的执行结果如图15-16所示。从这个执行结果可以看出,123.0.0.0.1和-12.255.0.10都被检查为错误的IP地址格式。

图 15-16 修正后的检查IP地址的结果

教程类别