定义简单的模式
使用PHP的某个正则表达式函数确实很容易,但是定义要使用的模式却很困难。PHP有许多规则用于创建模式。可以单独使用这些规则,或者组合使用它们,使得你的模式相当简单或者非常复杂。首先,你将看到哪些字符可用于定义简单的模式。作为一种格式化规则,我将用粗体定义模式,并用斜体指示模式匹配的内容。这些解释中的模式将不会放置在定界符或引号内(在preg_match()内使用模式时将需要它们),这样做只是为了使事情更清晰。
你将用于定义模式的第一类字符是字面量(literal),字面量是一个值,其书写方式与所解释的完全一样。例如,模式a将匹配字母a,ab将匹配ab等等。因此,假定执行不区分大小写的查找,那么rom将匹配下列任意字符串,因为它们全都包含rom:
你的模式将与字面量一起使用元字符(meta-character)。元字符是特殊的符号,其含义超出了它们的字面量值。虽然a只是简单地意指a,句点(.)将匹配除换行符之外的任意单个字符(.匹配a、b、c、下划线、空格等,仅仅不匹配\n)。为了匹配任意元字符,需要对其进行转义,这与对一个引号进行转义来打印它非常相似。因此,\.将匹配句点本身。因此,1.99将匹配1.99、1B99或1299(1后面接着任意字符,然后再接着99),但是1\.99只匹配1.99。
字符 | 含义 |
---|---|
\ | 转义符 |
^ | 指示字符串的开始 |
$ | 指示字符串的结尾 |
. | 除换行符之外的任意单个字符 |
| | 二中择一(或) |
[ | 类的开始 |
] | 类的结尾 |
( | 子模式的开始 |
) | 子模式的结尾 |
{ | 量词的开始 |
} | 量词的结尾 |
两个元字符指定必须在什么位置查找某些字符。一个是插入符号(^),它将匹配以插入符号后面的任何内容开头的字符串。还有一个是美元符号($),用于标记模式的结束。相应地,^a将匹配以a开头的任何字符串,而a$则对应于以a结尾的任何字符串。因此,^a$只匹配a(同时以a开头和结尾的字符串)。
这两个元字符(插入符号和美元符号)对于验证是至关重要的,因为验证通常需要检查整个字符串的值,而不仅仅是检查在一个字符串中是否存在另一个字符串。例如,在不使用这两个字符的情况下使用电子邮件匹配模式将匹配包含电子邮件地址的任何字符串。使用以插入符号开头并以美元符号结尾的电子邮件匹配模式将匹配只包含有效电子邮件地址的字符串。
正则表达式还利用竖线(|)作为或(or)的等价表示。因此,a|b将匹配包含a或b的字符串。[在模式内使用竖线被称为交替(alternation)或分支(branching)。]因此,yes|no将完全接受这两个单词中的任何一个[交替并不仅仅发生在包围它的两个字母(s和n)之间]。
一旦理解了基本的符号,就可以开始使用圆括号把字符组合进更复杂的模式中。组合将按你期待的那样工作:(abc)将匹配abc,(trout)将匹配trout。可以把圆括号看作用于建立一个更大尺寸的新字面量。由于PCRE中的优先级规则,因此,yes|no和(yes)|(no)是等价的。但是,(even|heavy)handed将匹配even handed或heavy handed。
提示