@javalaw2010
2015-08-29T11:42:50.000000Z
字数 2596
阅读 1399
PHP
web
PHP有两套正则表达式的处理函数,分别为以"preg_"开头的函数和以"ereg_"开头的函数,由于前一种的效率较后一种略有优势,因此只介绍第一种。
本学习笔记基于《细说PHP》第二版
1.概念
正则表达式描述了一种字符串匹配的模式,通过这个模式在特定的函数中对字符串进行匹配,替换,查找,分割等操作。
2.组成
- 原子(普通字符)
- 元字符(有特殊功能的字符)
- 模式修正符
模式表达式通常都放在界定符之间,一般使用/
作为定界符,但是除了字母,数字,和反斜线/
外,其他任何字符也可以当做定界符,如#
,!
,{}
,|
等。
原子是正则表达式最基本的组成单位,而且在每个模式中最少要包含一个原子。
所有的大小写字母,所有数字 如a~z,A~Z,0~9
比如'/php/'
用于匹配字符串中是否有php字符出现
任何符号都可以作为原子,但是如果符号在正则语法中有特殊的含义那就必须使用\
来取消它的特殊含义。比如所有的标点符号,比如'
,"
,+
,=
,.
如果要当原子,需要这样使用\'
,\"
,\+
,\=
,\.
比如'/\<br \/\>/'
用来匹配字符串中是否有HTML标签<br />
出现
例如空格,回车,制表符等成为非打印字符
原子字符 | 含义描述 |
---|---|
\cx |
匹配由x指明的控制符,x必须为a~z,A~Z |
\f |
匹配一个换页符,等价于\cL |
\n |
换行符,等价于\cJ |
\r |
回车符,等价于\cM |
\t |
制表符。等价于\cI |
\v |
垂直制表符,等价于\cK |
通用字符类型用于匹配一类字符而不是只有一个字符
原子字符 | 含义描述 |
---|---|
\d |
十进制数字,等价于[0-9] |
\D |
非十进制数字,等价于[^0-9] |
\s |
空白字符,等价于[\f\n\r\t\v] |
\S |
非空白字符,等价于[^\f\n\r\t\v] |
\w |
任意字母,数字,下划线,等价于[0-9a-zA-Z_] |
\W |
等价于[^0-9a-zA-Z_] |
使用[]
括起来,代表一组原子中的一个
'/[apj]sp/' //用来匹配asp,psp ,jsp中的任意一个字符串
'/o[xX][0-9a-zA-Z]+/' //匹配一个简单的16进制数
所谓元字符就是用于构建正则表达式的具有特殊含义的字符,在一个正则表达式中,元字符不能单独出现,他必须用来修饰原子。如果想要原子包含元字符本身,需要使用\
转义。
元字符 | 含义描述 |
---|---|
* |
匹配0次,1次,或多次其前的原子 |
+ |
匹配1次或多次其前的原子 |
? |
匹配0次或1次其前的原子 |
. |
匹配除了换行符外的任意一个字符 |
| |
匹配两个或多个分支选择 |
{n} |
表示其前面的原子恰好出现n次 |
{n,} |
表示其前面的原子出现不少于n次 |
{n,m} |
表示其前面的原子至少出现n次,至多出现m次 |
^ 或\A |
匹配输入字符串的开始位置(或多行模式下的开头) |
$ 或\Z |
匹配输入字符串的结束位置(或多行模式下的结尾) |
\b |
匹配单词的边界 |
\B |
匹配出单词边界以外的部分 |
[] |
匹配方括号中的任意一个字符 |
[^] |
匹配除方括号中的原子以外的任意一个字符 |
() |
匹配其整体为一个原子,即模式单元 |
限定符用来指定正则表达式的一个给定原子必须出现多少次才能满足匹配,共有6种限定符,分别为*
,+
,?
, {n}
,{n,}
,{n,m}
'/a\s*b/' //匹配在a,b之间没有空白,有一个和多个空白
'/ax{2,4}b/' //匹配在a,b之间至少有2个和最多4个x的字符串
'/^this/' //匹配次字符串是否以字符串“this”开头的
'/test$/' //匹配字符串是否以test结束的
'/\bis\b/' //匹配字符串中是否有单词is
'/\Bis\b/' //左边不能为边界而右边必须有边界,比如'this'
匹配除了换行符以外的任何字符
.*
为贪婪模式,而.*?
为懒惰模式,我们假设有如下字符串<b>abababababc</b>
,使用下列两种匹配方式进行匹配:
'/.*b/'
/*贪婪模式,匹配到的结果为共找到 1 处匹配:
<b>abababababc</b */
'/.*?/'
/*懒惰模式,匹配到的结果为共找到 7 处匹配:
<b
>ab
ab
ab
ab
ab
c</b
*/
根据这样的测试结果,可证实书中的部分内容有误,请知悉。
相当于逻辑算中的“或”,比如/Linux|Apache|MySQL|PHP/
可以匹配其中的任意一个
使用()
将多个原子组成大的原子,被当做一个独立单元使用,与数学中的()
类似。
使用()
括起来的原子,既是一个独立单元,也是一个子表达式。相关匹配会被存储到一个临时缓冲区,按照正则表达式中从左到右的顺序存储,编号从1开始,99结束,可以使用\n
来访问,不过在正则表达式中使用时,需要在使用\
进行转义。
'/^d{4}\W\d{2}\W\d{2}$/' //匹配日期的格式 如2008-08/08 2008/08-08
'/^d{4}\W\d{2}\\1\d{2}$/' //匹配日期的格式 如2008/08/08 2008-08-08
如果使用模式单元而又不想存储匹配结果时可以使用非捕获符
?:
,?=
,?!
来忽略对相关匹配的保存。
'/(?:windows)(linux)\\1OS/' // \1引用就是linux
模式修正符在定界符之外使用,模式修正符可以组合在一起使用。
模式修正符号 | 功能描述 |
---|---|
i |
不区分大小写 |
m |
将字符串视为多行每一行的开头就是^ ,结尾就是$ |
s |
设定了此修正符后,. 将会匹配所有字符,包括换行符。即将字符串视为单行 |
x |
模式中的空白忽略不计,除非它已经被转义 |
e |
只在preg_replace() 函数中使用,在替换字符串中对逆向引用做正常的替换,将其作为PHP代码求值,并用其结果来替代所搜索的字符串 |
U |
本修正符反转了匹配数量的值使其不是默认的重复 |
D |
模式中的$ 仅匹配目标字符串的结尾,没有此修正符时,如果最后一个字符是换行符的话,美元符号也会匹配此字符之前,如果设定了m 则忽略此选项。 |
比如:
'/Web Server/ix' // 可以用来匹配webserver,忽略大小写和空白
'/^is/m' // 可以匹配this\nis\na\ntes中的is,因为字符串被视作了多行