日期:2010-12-02  浏览次数:20543 次


1 前言
PHP被大量的应用于Web的后台CGI开发,通常是在用户数据数据之后得出某种结果,但是如果用户输入的数据不正确,就会出现问题,比如说某人的生日是\"2月30日\"!那应该怎么样来检验暑假是否正确呢? 在PHP中加入了正则表达式的支持,让我们可以十分方便的进行数据匹配。

2 什么是正则表达式:
简单的说,正则表达式是一种可以用于模式匹配和替换的强大工具。在几乎所有的基于UNIX/LINUX系统的软件工具中找到正则表达式的痕迹,例如:Perl或PHP脚本语言。此外,JavaScript这种客户端的脚本语言也提供了对正则表达式的支持,现在正则表达式已经成为了一个通用的概念和工具,被各类技术人员所广泛使用。
在某个Linux网站上面有这样的话:\"如果你问一下Linux爱好者最喜欢什么,他可能会回答正则表达式;如果你问他最害怕什么,除了繁琐的安装配置外他肯定会说正则表达式。\"
正如上面说的,正则表达式看起来非常复杂,让人害怕,大多数的PHP初学者都会跳过这里,继续下面的学习,但是PHP中的正则表达式有着可以利用模式匹配找到符合条件的字符串、判断字符串是否合乎条件或者用指定的字符串来替代符合条件的字符串等强大的功能,不学实在太可惜了……

3 正则表达式的基本语法:
一个正则表达式,分为三个部分:分隔符,表达式和修饰符。
分隔符可以是除了特殊字符以外的任何字符(比如\"/ !\"等等),常用的分隔符是\"/\"。表达式由一些特殊字符(特殊字符详见下面)和非特殊的字符串组成,比如\"[a-z0-9_-]+@[a-z0-9_-.]+\"可以匹配一个简单的电子邮件字符串。修饰符是用来开启或者关闭某种功能/模式。下面就是一个完整的正则表达式的例子:
/hello.+?hello/is
上面的正则表达式\"/\"就是分隔符,两个\"/\"之间的就是表达式,第二个\"/\"后面的字符串\"is\"就是修饰符。
在表达式中如果含有分隔符,那么就需要使用转义符号\"\\",比如\"/hello.+?\/hello/is\"。转义符号除了用于分隔符外还可以执行特殊字符,全部由字母构成的特殊字符都需要\"\\"来转义,比如\"\d\"代表全体数字。

4 正则表达式的特殊字符:
正则表达式中的特殊字符分为元字符、定位字符等等。
元字符是正则表达式中一类有特殊意义的字符,用来描述其前导字符(即元字符前面的字符)在被匹配的对象中出现的方式。元字符本身是一个个单一的字符,但是不同或者相同的元字符组合起来可以构成大的元字符。
元字符:
大括号:大括号用来精确指定匹配元字符出现的次数,例如\"/pre{1,5}/\"表示匹配的对象可以是\"pre\"、\"pree\"、\"preeeee\"这样在\"pr\"后面出现1个到5个\"e\"的字符串。或者\"/pre{,5}/\"代表pre出现0此到5次之间。
加号:\"+\"字符用来匹配元字符前的字符出现一次或者多次。例如\"/ac+/\"表示被匹配的对象可以是\"act\"、\"account\"、\"acccc\"等在\"a\"后面出现一个或者多个\"c\"的字符串。\"+\"相当于\"{1,}\"。
星号:\"*\"字符用来匹配元字符前的字符出现零次或者多次。例如\"/ac*/\"表示被匹配的对象可以是\"app\"、\"acp\"、\"accp\"等在\"a\"后面出现零个或者多个\"c\"的字符串。\"*\"相当于\"{0,}\"。
问号:\"?\"字符用来匹配元字符前的字符出现零次或者1次。例如\"/ac?/\"表示匹配的对象可以是\"a\"、\"acp\"、\"acwp\"这样在\"a\"后面出现零个或者1个\"c\"的字符串。\"?\"在正则表达式中还有一个非常重要的作用,即\"贪婪模式\"。

还有两个很重要的特殊字符就是\"[ ]\"。他们可以匹配\"[]\"之中出现过的字符,比如\"/[az]/\"可以匹配单个字符\"a\"或者\"z\";如果把上面的表达式改成这样\"/[a-z]/\",就可以匹配任何单个小写字母,比如\"a\"、\"b\"等等。
如果在\"[]\"中出现了\"^\",代表本表达式不匹配\"[]\"内出现的字符,比如\"/[^a-z]/\"不匹配任何小写字母!并且正则表达式给出了几种\"[]\"的默认值:
[:alpha:]:匹配任何字母
[:alnum:]:匹配任何字母和数字
[:digit:]:匹配任何数字
[:space:]:匹配空格符
[:upper:]:匹配任何大写字母
[:lower:]:匹配任何小写字母
[:punct:]:匹配任何标点符号
[:xdigit:]:匹配任何16进制数字

另外下面这些特殊字符在转义符号\"\\"转义后代表的含义如下:
s:匹配单个的空格符
S:用于匹配除单个空格符之外的所有字符。
d:用于匹配从0到9的数字,相当于\"/[0-9]/\"。
w:用于匹配字母,数字或下划线字符,相当于\"/[a-zA-Z0-9_]/\"。
W:用于匹配所有与w不匹配的字符,相当于\"/[^a-zA-Z0-9_]/\"。
D:用于匹配任何非10进制的数字字符。
.:用于匹配除换行符之外的所有字符,如果经过修饰符\"s\"的修饰,\".\"可以代表任意字符。

利用上面的特殊字符可以很方便的表达一些比较繁琐的模式匹配。例如\"/\d0000/\"利用上面的正则表达式可以匹配万以上,十万一下的整数字符串。

定位字符:
定位字符是正则表达式中又一类非常重要的字符,它的主要作用是用于对字符在匹配对象中的位置进行描述。
^:表示匹配的模式出现在匹配对象的开头(和在\"[]\"里面不同)
$:表示匹配的模式出现在匹配对象的末尾
空格:表示匹配的模式出现在开始和结尾的两个边界之一
\"/^he/\":可以匹配以\"he\"字符开头的字符串,比如hello、height等等;
\"/he$/\":可以匹配以\"he\"字符结尾的字符串即she等;
\"/ he/\&qu