@tingyuge
2016-10-03T18:12:11.000000Z
字数 1768
阅读 2038
正则表达式
PHP
正则表达式是对字符串进行操作的一种逻辑公式,就是用一些特定的字符组合成一个规则字符串,称之为正则匹配模式。
比如:
$p = '/apple/';
$str = 'apple banna';
if (preg_match($p, $str)) {
echo 'success';
}
其中的字符串'/apple/'就是一个正则表达式,用来匹配源字符串中的apple。preg_match
会返回匹配的次数0或1
,因为preg_match
在第一次匹配后会停止搜索,出现错误会返回false。更过的函数需参考PCRE函数。
在PCRE的正则语法中,正则模式使用分隔符与元字符组成。模式需要由分隔符
闭合包裹。
分隔符可以是任意非字母数字、非反斜线、非空白字符。
经常使用的分隔符是
/
、#
以及~
。
例如:
/foo/
#^[^0-9]$#
~php~
如果模式中包含分隔符,则需要使用反斜线进行转义。
/http:\/\//
如果模式中包含过多的分隔符,建议使用其他的字符作为分隔符,例如:
/http:\/\// ====> #http://#
或者使用preg_quote()
函数对模式字符串进行转义它的第二个参数(可选)可以用于指定需要被转义的分隔符。
$p = 'http://';
$p = '/' . preg_quote($p, '/') . '/';
除了上面提到的分隔符,也可以使用括号样式的分隔符,左括号和右括号分别作为开始和结束 分隔符。
{http://}
可以在结束分隔符后面增加模式修饰符。#[a-z]#i
是一个大小写不敏感的匹配。
元字符:
元字符就是一些被赋予了特殊含义的字符。元字符有两种:
- 一种是是可以在模式中
方括号
外任何地方使用的- 另外一种是需要在
方括号
内使用的。
在方括号外使用的元字符如下:
当使用在方括号中是不再具有特殊含义,而代表的就是其本身。[$]表示匹配
$
\
一般用于转义字符^
断言目标的开始位置(或在多行模式下是行首)$
断言目标的结束位置(或在多行模式下是行尾).
匹配除换行符外的任何字符(默认)[
开始字符类定义]
结束字符类定义|
开始一个可选分支(
子组的开始标记)
子组的结束标记?
作为量词,表示 0 次或 1次匹配。位于量词后面用于改变量词的贪婪特性。*
0次或多次匹配+
1次或多次匹配{2}
自定义匹配次数为2次,{2,}
表示匹配次数不低于2次,{1,22}
表示匹配次数在1-22之间在方括号内的部分仅有以下可用元字符:
\
转义字符[^abc]
表示不是a也不是b也不是c的字符0-9
标记字符0-9范围内反斜线定义的特殊字符含义:
\d
任意十进制数字\D
任意非十进制数字\s
任意空白字符\S
任意非空白字符\w
任意字母字符\W
任意非字母字符字符类与方括号
左方括号开始一个字符类的描述,并以右方括号结束。单独的一个右方括号没有特殊含义。
一个字符类在目标字符串中匹配一个单独的字符;该字符必须是字符类中定义的字符集合的其中一个, 除非使用了^
对字符类取反。
例如:/[aeiou]/
匹配所有的a
, e
, i
, o
, u
,然而/[^aeiou]/
匹配初他们之外的字符。
在字符类中,一个中划线(-
)可以用于指定从一个字符到另一个字符的范围。 比如,/[d-m]/
匹配d
到m
之间的所有字符。
子模式与小括号
子模式通过圆括号分隔界定,并且它们可以嵌套。
子模式可以将可选分支局部化。比如,模式/cat(arcat|erpillar|)/
匹配 cat
,cataract
,caterpillar
中的一个,如果没有圆括号的话,它匹配的则是cataract
,erpillar
以及空字符串。
重复与量词
一般的重复量词指定了一个最小数值和一个最大数值的匹配次数,通过花括号包裹两个数字,两个数字之间用逗号隔开的语法定义。 比如z{2,4}
匹配zz
,zzz
,zzzz
。如果第二个数字被省略,但是逗号仍然存在,就代表没有上限; 如果第二个数字和逗号都被省略,那么这个量词就限定的是一个确定次数的匹配。 比如/[a-z]{3,}/
匹配至少三个
连续的小写字母,但是同时也可以匹配更多,而/\d{8}/
则只能匹配8个数字
。
左花括号出现在不允许使用量词的位置或者与量词语法不匹配时,被认为是一个普通字符,对它自身进行原文匹配。比如,/{,6}/
就不是一个量词,会按照原文匹配四个字符{,6}
。
更多可以参见PCRE正则语法