3.5 正则表达式
正则表达式是一种依赖其自身的微型语言——专为用文本描述模式而设计的一种语言。
尽管正则表达式是极其简洁的,但是它有自己的语法和规则——非常灵活和强大。从抽象层
面上看,一个正则表达式由正则字符(字母a、逗号、数值等)和元字符(如星号、圆括号
等)所构成的,其中元字符联合构成了一个文本模式的程序性描述。因此正则表达式允许编
程人员匹配文本内的模式和子模式。例如编程人员可以在单词内查找每个元音字母,从电子
邮件中抽取用户名或者在网页内容中查找所有的超级链接。
PHP 中有两种形式的正则表达式,而且形式十分相似。这两种形式分别被称作“POSIX
扩展”正则表达式和“Perl 兼容”正则表达式。它们的语法稍微不同,但每种形式的基本构
建是一样的。本节将介绍如何使用Perl 兼容正则表达式,因为这种形式更加强大,而且是二
进制安全的。读者可以在下列网址中获取到POSIX 扩展正则表达式的描述:http://www.php.
net/manual/en/ref.regex.php。
一旦掌握了 Perl 兼容正则表达式,则使用POSIX 扩展正则表达式会十分容易。
正则表达式在数据有效性检查方面有着重要的作用。使用正则表达式执行简单的数据有
效性检查,可以保证从网络上所接受到的任何数据都得到了正确的格式化和有效性检查。
126 PHP 网络编程技术与实例
3.5.1 正则表达式基础
正则表达式用来查找文本中的模式。正则表达式用特殊的定界字符,通常用正斜杠(/)
将其两端括起来。正则表达式内有两种明确类型的字符:正则字符和元字符。如果使用一个
没有元字符的正则表达式,则只进行纯文本搜索;如果完全不采取正则表达式,使用strstr()
函数也可实现同样的效果。使用元字符,可以把字符(和其他元字符)组合成匹配于各种复
杂模式的更高级表达式。每个正则表达式都是由表达式组成,而表达式可以像单个字符一样
简单,也可以像含有多层子表达式的复合结构那样复杂。
例如,正则表达式“/dog/”将匹配串“dog”,这也是一个没有使用元字符的正则表达式。
相反,正则表达式“/[dog]/”使用了元字符“[”和“]”,因此将执行匹配串“d”、串“o”或
者“g”的更复杂的工作。
正则表达式中的任意一个正则字符都匹配它自身。正则表达式中的 P 将匹配串中的P。
这样的匹配在默认的情况下是区分大小写的。
下面介绍正则表达式中的元字符,如表 3-3 所示。
表 3-3 正则表达式的元字符
元 字 符 名 称描 述
\ 反斜杠转义字符。如\t 将匹配一个制表符,而不是匹配字母t
| 管道运算符表示“匹配其中任何一个”,如dog|pig 将匹配dog 或者pig
( ) 开始与结束圆括号把字符、元字符和子表达式组合成组,如(foo|bar)baz 将匹配fool 或者bar 后跟baz
[ ] 开始与结束方括号建立一个字符类,该类将匹配方括号内所包括的任意一个字符(或者表达式),例
如[xyz]将匹配任何一个这样的串,只要它含有字母x、y 和z 中的任意一个
{ } 开始与结束大括号为前导表达式定义一个最小/最大匹配数目,例如a{2,4}将匹配串aa,aaa 和aaaa
^ 插入符匹配一行的起点,或者说,如果^是一个字符类中的第一个字符,意味着“匹配这
个字符类中没有被发现的任何字符”
$ 美元符匹配一行的结束点
* 星号匹配 0 个或者多个前导表达式
? 问号匹配 0 个或者1 个前导表达式
+ 加号匹配 1 个或者多个前导字符表达式
. 句点或者点匹配任一字符
正则表达式中的元字符不被翻译成正常字符。如果希望这些字符之一在正则表达式中
用做实际值,必须用一个反斜杠来转义(即前缀)。假如要查找一个点,则需要在模式内
搜索“\.”。
正则表达式在正常的情况下包含在两个斜杠(即正斜杠)之间,其中一个在正则表达式
的开始处,另一个在结束处(尽管可以使用任何一个字符作为界定符,但是“/”是一个公共
约定)。因此一个最基本的正则表达式如“/php/”。