[关闭]
@tingyuge 2016-10-03T18:12:11.000000Z 字数 1768 阅读 2007

PHP的正则表达式

正则表达式 PHP


什么是正则表达式

正则表达式是对字符串进行操作的一种逻辑公式,就是用一些特定的字符组合成一个规则字符串,称之为正则匹配模式。

比如:

  1. $p = '/apple/';
  2. $str = 'apple banna';
  3. if (preg_match($p, $str)) {
  4. echo 'success';
  5. }

其中的字符串'/apple/'就是一个正则表达式,用来匹配源字符串中的apple。preg_match会返回匹配的次数0或1,因为preg_match在第一次匹配后会停止搜索,出现错误会返回false。更过的函数需参考PCRE函数

基本语法

在PCRE的正则语法中,正则模式使用分隔符与元字符组成。模式需要由分隔符闭合包裹。
分隔符可以是任意非字母数字、非反斜线、非空白字符。

经常使用的分隔符是/#以及~

例如:

/foo/
#^[^0-9]$#
~php~

如果模式中包含分隔符,则需要使用反斜线进行转义。

/http:\/\//

如果模式中包含过多的分隔符,建议使用其他的字符作为分隔符,例如:

/http:\/\// ====> #http://#

或者使用preg_quote()函数对模式字符串进行转义它的第二个参数(可选)可以用于指定需要被转义的分隔符。

  1. $p = 'http://';
  2. $p = '/' . preg_quote($p, '/') . '/';

除了上面提到的分隔符,也可以使用括号样式的分隔符,左括号和右括号分别作为开始和结束 分隔符。

{http://}

可以在结束分隔符后面增加模式修饰符。#[a-z]#i是一个大小写不敏感的匹配。

元字符:
元字符就是一些被赋予了特殊含义的字符。元字符有两种:

  • 一种是是可以在模式中方括号外任何地方使用的
  • 另外一种是需要在方括号内使用的。

在方括号外使用的元字符如下:

当使用在方括号中是不再具有特殊含义,而代表的就是其本身。[$]表示匹配$

在方括号内的部分仅有以下可用元字符:

反斜线定义的特殊字符含义:

字符类与方括号

左方括号开始一个字符类的描述,并以右方括号结束。单独的一个右方括号没有特殊含义。
一个字符类在目标字符串中匹配一个单独的字符;该字符必须是字符类中定义的字符集合的其中一个, 除非使用了^对字符类取反。
例如:/[aeiou]/匹配所有的a, e, i, o, u,然而/[^aeiou]/匹配初他们之外的字符。
在字符类中,一个中划线(-)可以用于指定从一个字符到另一个字符的范围。 比如,/[d-m]/匹配dm之间的所有字符。

子模式与小括号
子模式通过圆括号分隔界定,并且它们可以嵌套。
子模式可以将可选分支局部化。比如,模式/cat(arcat|erpillar|)/匹配 catcataractcaterpillar 中的一个,如果没有圆括号的话,它匹配的则是cataracterpillar 以及空字符串。

重复与量词
一般的重复量词指定了一个最小数值和一个最大数值的匹配次数,通过花括号包裹两个数字,两个数字之间用逗号隔开的语法定义。 比如z{2,4}匹配zzzzzzzzz。如果第二个数字被省略,但是逗号仍然存在,就代表没有上限; 如果第二个数字和逗号都被省略,那么这个量词就限定的是一个确定次数的匹配。 比如/[a-z]{3,}/匹配至少三个连续的小写字母,但是同时也可以匹配更多,而/\d{8}/只能匹配8个数字
左花括号出现在不允许使用量词的位置或者与量词语法不匹配时,被认为是一个普通字符,对它自身进行原文匹配。比如,/{,6}/就不是一个量词,会按照原文匹配四个字符{,6}

更多可以参见PCRE正则语法

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注