第9章 正则表达式
9.1 正则表达式简介
9.1.1 选择PHP正则表达式的处理函数库
preg_match() //进行正则表达式匹配
preg_match_all() //进行全局正则表达式匹配
preg_replace() //执行正则表达式的搜索和替换
preg_split() //用正则表达式分割字符串
preg_grep() //返回与模式匹配的数组单元
preg_replace_callback() //用回调函数执行正则表达式的搜索和替换
9.2正则表达式的语法规则
9.2.1 定界符
通常需要将模式表达式放入定界符之间,作为定界符的字符不仅仅局限于斜线
"/"
.除了字母,数字和反斜线以外的任何字符都可以作为定界符号,如下:
//
||
!!
{}
##
9.2.2 原子
原子是正则表达式的最基本组成单位,而且在每个模式中最少要包含一个原子,原子由所有那些未显示指定为元字符的打印和非打印字符组成
1.普通字符作为原子
如所有大小写字符,所有数字等
2.一些特殊字符和元字符作为原子
任何一个符号都可以作为原子使用,但如果这个符号在正则表达式中有一些特殊意义,就必须使用
"\"
进行转义。
3.一些非打印字符作为原子
\cx //匹配由x指明的控制字符,例如:\cM匹配一个Control+M或回车符。x的值必须在A~Z或a~z之一,否则将c视为一个原义的'c'字符
\f //匹配一个换页符。等价于\x0C和\cL
\n //匹配一个换行符。等价于\x0a和\cJ
\r //匹配一个回车符。等价于\x0d和\cM
\t //匹配一个制表符。等价于\x09和\xI
\v //匹配一个垂直制表符。等价于\x0b和\cK
4.使用“通用字符类型”作为原子
\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]
5.自定义原子表([])作为原子
使用原子表“[]”就可以定义一组彼此地位平等的原子,且从原子表中仅选择一个原子进行匹配
'/[apj]sp/' //可以匹配asp,psp,jsp三种,从原子表中仅选择一个作为原子
9.2.3 元字符
在一个正则表达式中,元字符不能单独出现,它必须是用来修饰原子的。
如果要在正则表达式中包含元字符本身,必须在前面加上""进行转义
* //匹配0次,1次或多次其前的原子
+ //匹配1次或多次其前的原子
? //匹配0次或1次其前的原子
. //匹配除了换行符外的任意一个字符
| //匹配两个或多个分支选择
{n} //表示其前面的原子恰好出现n次
{n,} //表示其前面的原子出现不少于n次
{n,m} //表示其前面的原子至少出现n次,最多出现m次
^或\A //匹配输入字符串的开始位置(或在多行模式下行的开头)
$或\Z //匹配输入字符串的结束位置(或在多行模式下行的结尾)
\b //匹配单词的边界
\B //匹配单词边界以外的地方
[] //匹配方括号中指定的任意一个原子
[^] //匹配除方括号中的原子以外的任意一个字符
() //匹配其整体为一个原子,即模式单元。可以理解为由多个单个原子组成的大原子
后向引用:使用元字符"()"标记的开始和结束多个原子,不仅是一个独立的单元,也是一个子表达式。
对每一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,可以被获取供以后使用。
所捕获的每个子匹配都按照在正则表达式模式中从左至右所遇到的内容存储,存储自匹配的缓冲区编号从1开始
每个缓冲区都可以使用'\n'
访问,在正则表达式的模式中使用时,还需要在前面再加上一个反斜线,例如"\\1","\\2","\\3"
等
可以使用非捕获元字符"?:","?=","?!"
来忽略对相关匹配的保存。
'/(windows)(Linux)\\2OS/' //使用“\2”再次引用第二个缓冲区中的字符串“Linux”
'/(?:Windows(Linux)\\1OS)/' //使用“?:”忽略了第一个子表达式的存储,所以“\1”引用的就是“Linux”
9.2.4 模式修正符
模式修正符号在正则表达式定界符之外使用(最后一个斜线“/”之后)
模式修正符可以调整正则表达式的解释
模式修正符可以组合使用
i //在进行模式匹配时不区分大小写
m //将字符串视为多行
s //此修正符将“.”匹配所有字符,包括换行符。即将字符串视为单行,换行符作为普通字符看待
x //模式中的空白忽略不计,除非它已被转义
e //只用在preg_replace()函数中,在替换字符串中对逆向引用做正常的替换,将其作为PHP代码求值,并用其结果来替换所搜索的字符串
U //反转了匹配数量的值使其不是默认的重复,而变成在后面跟上“?”才变得重复
D //模式中的"$"仅匹配目标字符串的结尾
9.3 与Perl兼容的正则表达式函数
正则表达式不能独立使用,它只是一种用来定义字符串的规则模式,必须在相应的正则表达式函数中应用,才能实现对字符串的匹配、查找、替换及分割等操作
在处理大量信息时,正则表达式函数会使速度大幅减慢
//正则表达式函数
preg_match() //进行正则表达式匹配
preg_match_all() //进行全局正则表达式匹配
preg_replace() //执行正则表达式的搜索和替换
preg_split() //用正则表达式分割字符串
preg_grep() //返回与模式匹配的数组单元
preg_replace_callback() //用回调函数执行正则表达式的搜索和替换
//PHP字符串处理函数
strstr() //搜索一个字符串在另一个字符串中的第一次出现,返回字符串的其余部分(从匹配点),如未搜索到,则返回false
strpos() //返回字符串在另一个字符串中第一次出现的位置,如未找到该字符串,则返回false
strrpos() //查找字符串在另一个字符串中最后一次出现的位置
//strpos(),strrpos()对大小写敏感,如需进行对大小写不敏感的操作,则可以用stripos(),strirpos()进行搜索
substr() //返回字符串的一部分
str_replace() //字符串替换
explode() //用某个特定的字符对字符串进行分割
implode() //把数组中所有元素组合为一个字符串。函数join()为该函数的别名