PHP正则表达式学习笔记1
(《细说PHP》12章笔记1)
1 正则表达式简介
正则表达式也称为模式表达式,自身具有一套非常完整的,可以编写模式的语法体系,提供一种灵活且直观的字符串处理方法。
正则表达式通过构建具有特定规则的模式,与输入的字符串信息比较,在特定的函数中使用从而实现字符串的匹配。
1.1 选择PHP正则表达式的处理函数库
在PHP中支持两套正则表达式的处理函数库,一套是由PCRE(Prel Compatible Regular Expression)来提供的,与Perl语言兼容的正则表达式函数。
使用以"preg_"为前缀命名的函数,而且表达式都应被包含在定界符中,如斜线。
另一套是由POSIX(Portable Operation System interface)扩展语法的正则表达式函数,使用以"ereg_"为前缀命名的函数。
两套函数库的功能相似,执行效率稍有不同。
一般而言,实现相同功能,使用第一种PCRE库提供的正则表达式效率略占优势。
2 正则表达式的语法规则
正则表达式作为一个匹配的查板,是由原子(普通字符,例如字符a到z),有特殊功能的字符(称为元字符,例如*,+和?等),以及模式修正符三部分组成的文字模式。
2.1定界符
通常都需要将模式表达式放入定界符之间。作为定界的字符也不仅仅局限于使用斜线"/"。除了字母,数字和反斜线"\"以外的字符都以作为定界符号,例如"#","!","{}"和"|"
2.2原子
原子是正则表达式的最基本组成单位(???吐槽:我初中物理老师可是说原子是分子的组成单位啊)
每个模式中最少要包含一个原子
1 普通字符作为原子
所有的大小写字母,所有数字
/5/ --匹配字符串中是否有5这个字符出现
/php/ --匹配字符串中是否有php字符串出现
2一些特殊字符和元字符作为原子
如果一些特殊符号在正则表达式中有一些特殊意义,必须使用转义字符"\"取消它的特殊意义,将其变成一个普通的原子
所有标点符号以及一些其他符号,双引号“"”,“'”,“+”,“.”等等,\" \' \+ \.
例: /\<br\/\>/
3一些非打印字符作为原子
\cx 匹配由x指明的控制字符,例如:\cM匹配一个Control-M或回车符,x的值必须为A~Z或a~z之一,否则,将c视为一个原义的'c'字符
\f 匹配一个换页符,等价于\x0c和\cL
\n 匹配一个换行符,等价于\x0a和\cJ
\r 匹配一个回车符,等价于\x0d和\cM
\t 匹配一个制表符,等价于\x09和\cI
\v 匹配一个垂直制表符,等价于\x0b和\cK
例:
'/\n/'' --在Windows系统中用于匹配字符串中是否有回车换行出现。
'/\r\n/' --在Linux系统中用于匹配字符串中是否有回车换行出现。
4使用"通用字符类型"作为原子
\d 匹配任意一个十进制数字,等价于[0-9]
\D 匹配任意一个非十进制数字以外的字符,等价于[^1-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
'/[^apj]sp/' 匹配除asp,psp或jsp外的其它sp
'/0[xX][0-9a-fA-F]+/' 匹配一个十六进制
2.3元字符
元字符就是用于构建正则表达式的具有特殊含义的字符,例如"*","+"之类。
在一个正则表达式中,元字符不能单独出现,它必须是用来修饰原子的。
如果要在正则表达式中包含元字符本身,使其失去特殊含义,则必须在前面加上"\"进行转义
* 匹配0次,1次或多次其前的原子
+ 匹配1次或多次其前的原子
? 匹配0次或1次其前的原子
. 匹配除换行符外的任意一个字符
| 匹配两个或多个分支选择
{n} 表示其前面的原子恰好出现n次
{n,} 表示其前面的原子出现不少于n次
{n,m} 表示其前面的原子到少出现n次,最多出现m次
^或\A 匹配输入字符串的开始位置(或在多行模式下行的开头,即紧随一换行符之后)
$或\Z 匹配输入字符串的结束位置(或在多行模式下行的结尾,即紧随一换行符之前)
\b 匹配单词的边界
\B 匹配单词边界以外的部分
[] 匹配方括号指定的任意一个原子
[^] 匹配除方括号中的原子以外的任意一个字符
() 匹配其整体为一个原子,即模式单元,可以理解为由多个单个原子组成的大原子
1限定符
限定符来指定正则表达式的一个给定原子必须出现多少次才能满足匹配
有* + ? {n} {n,} {n,m} 6种
2边界限制
有来限定字符串或单词的边界范围,以获得更准确的匹配结束
^ $分别指字符串的开结与结束
\b 用于描述字符串中每个单词的前或后边单
\B 表示非单词边界
字符串 this is a test
'/^this/' --匹配此字符串是否是以字符串"this"开始的,匹配成功
'/test$/' --匹配此字符串是否是以字符串"test"结束的,匹配成功
'/\bis\b/' --匹配字符串中是否含有单词"is",因为字符串"is"两边都需要有边界
'/\Bis\b/' --查找字符串"is"时,左边不能为边界而右边必须有边界,如"this"匹配成功
3句号(.)
在字符类之外,模式中的圆点可以匹配目标中的任何一个字符,包括不可打印字符。
但不匹配换行符(默认情况下),相当于"[^\n]"(Unix系统)或"[^\r\n]"(Windows系统)。
处理.与^和$是完全独立的,唯一的联系就是它们都涉及换行符
'/a.b/' --匹配在a和b之间任意一个字符的字符串
4模式选择符(|)
竖线字符"|"用来分隔多选一模式
例:
"LAMP|J2EE"表示可匹配LAMP或J2EE,因为元字符竖线"|"的优先级是最低的
5模式单元
模式单元是使用元字符"()"将多个原子组成大的原子,被当成一个单元独立使用。与数学表达式中的括号作用类似,一个模式中的表达式将被优先匹配
例:
'/(very)* good/' --可匹配 good,very good,very very good,very very …… good
6后向引用
一个正则表达式模式或部分模式两边添加圆括号装将导致相关匹配存储到一个临时缓冲区中,可以被获取供以后使用,所捕获的每个子匹配都按照在正则表达式模式中从左至右所遇到的内容存储,存储子匹配的缓冲区编号从1开始,连续编号直至最大99个子表达式,用\n型式引用,在正则表达式中成\\n
例:
'/^\d{4}\W\d{2}\W\d{2}$/' -- 2000-01/01能匹配
'/^\d{4}(\W)\d{2}\\1\d{2}$/' -- 2000-01-01
当需要使用模式单元而又不想存储匹配结果时,可以使用非捕获元字符"?:","?=","?!"来忽略相关匹配的保存。
'/(Windows)(Linux)\\2OS/'
'/(?:Windows)(Linux)\\1OS/'
7模式匹配的优先级
相同优先级从左向右,不同从上到下
\ 转义字符
() (?:) (?=) [] 模式单元和原子表
* + ? (n) (n,) (n,m) 重复匹配
^ $ \b \B \A \Z 边界限制
| 模式选择
2.4模式修正符
模式修正符在正则表达式定界符之外使用(最后一个斜线"/"之后)
模式修正符可以调整正则表达式的解释,扩展了正则表达式的在匹配,替换等操作时某些功能,而且模式修正符也可以组合使用,更增强了正则表达式的处理能力。
i 在和模式进行匹配时不区分大小写
m 将字符串视为多行,默认的正则开始"^"和结束"$"将目标字符串作为单一的"行"字符
s 模式中的画点元字符"."匹配所有的字符,包括换行符。
x 模式中的空白忽略不计,除非它已经被转义
e 只用在preg_replace()函数中,在替换字符串中对逆向引用做正常的替换,将其作为PHP代码求值,并用其结果来替换所搜索的字符串
U 本修正符反转了匹配数量的值使其不是默认的重复,而变成后面跟上"?"才变得重复。
D 模式中的美元元字符仅匹配目标字符串的结尾。没有此项时,如果最后一个字符是换行符的话,美元符号也会匹配此字符之前。
(《细说PHP》12章笔记1)
1 正则表达式简介
正则表达式也称为模式表达式,自身具有一套非常完整的,可以编写模式的语法体系,提供一种灵活且直观的字符串处理方法。
正则表达式通过构建具有特定规则的模式,与输入的字符串信息比较,在特定的函数中使用从而实现字符串的匹配。
1.1 选择PHP正则表达式的处理函数库
在PHP中支持两套正则表达式的处理函数库,一套是由PCRE(Prel Compatible Regular Expression)来提供的,与Perl语言兼容的正则表达式函数。
使用以"preg_"为前缀命名的函数,而且表达式都应被包含在定界符中,如斜线。
另一套是由POSIX(Portable Operation System interface)扩展语法的正则表达式函数,使用以"ereg_"为前缀命名的函数。
两套函数库的功能相似,执行效率稍有不同。
一般而言,实现相同功能,使用第一种PCRE库提供的正则表达式效率略占优势。
2 正则表达式的语法规则
正则表达式作为一个匹配的查板,是由原子(普通字符,例如字符a到z),有特殊功能的字符(称为元字符,例如*,+和?等),以及模式修正符三部分组成的文字模式。
2.1定界符
通常都需要将模式表达式放入定界符之间。作为定界的字符也不仅仅局限于使用斜线"/"。除了字母,数字和反斜线"\"以外的字符都以作为定界符号,例如"#","!","{}"和"|"
2.2原子
原子是正则表达式的最基本组成单位(???吐槽:我初中物理老师可是说原子是分子的组成单位啊)
每个模式中最少要包含一个原子
1 普通字符作为原子
所有的大小写字母,所有数字
/5/ --匹配字符串中是否有5这个字符出现
/php/ --匹配字符串中是否有php字符串出现
2一些特殊字符和元字符作为原子
如果一些特殊符号在正则表达式中有一些特殊意义,必须使用转义字符"\"取消它的特殊意义,将其变成一个普通的原子
所有标点符号以及一些其他符号,双引号“"”,“'”,“+”,“.”等等,\" \' \+ \.
例: /\<br\/\>/
3一些非打印字符作为原子
\cx 匹配由x指明的控制字符,例如:\cM匹配一个Control-M或回车符,x的值必须为A~Z或a~z之一,否则,将c视为一个原义的'c'字符
\f 匹配一个换页符,等价于\x0c和\cL
\n 匹配一个换行符,等价于\x0a和\cJ
\r 匹配一个回车符,等价于\x0d和\cM
\t 匹配一个制表符,等价于\x09和\cI
\v 匹配一个垂直制表符,等价于\x0b和\cK
例:
'/\n/'' --在Windows系统中用于匹配字符串中是否有回车换行出现。
'/\r\n/' --在Linux系统中用于匹配字符串中是否有回车换行出现。
4使用"通用字符类型"作为原子
\d 匹配任意一个十进制数字,等价于[0-9]
\D 匹配任意一个非十进制数字以外的字符,等价于[^1-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
'/[^apj]sp/' 匹配除asp,psp或jsp外的其它sp
'/0[xX][0-9a-fA-F]+/' 匹配一个十六进制
2.3元字符
元字符就是用于构建正则表达式的具有特殊含义的字符,例如"*","+"之类。
在一个正则表达式中,元字符不能单独出现,它必须是用来修饰原子的。
如果要在正则表达式中包含元字符本身,使其失去特殊含义,则必须在前面加上"\"进行转义
* 匹配0次,1次或多次其前的原子
+ 匹配1次或多次其前的原子
? 匹配0次或1次其前的原子
. 匹配除换行符外的任意一个字符
| 匹配两个或多个分支选择
{n} 表示其前面的原子恰好出现n次
{n,} 表示其前面的原子出现不少于n次
{n,m} 表示其前面的原子到少出现n次,最多出现m次
^或\A 匹配输入字符串的开始位置(或在多行模式下行的开头,即紧随一换行符之后)
$或\Z 匹配输入字符串的结束位置(或在多行模式下行的结尾,即紧随一换行符之前)
\b 匹配单词的边界
\B 匹配单词边界以外的部分
[] 匹配方括号指定的任意一个原子
[^] 匹配除方括号中的原子以外的任意一个字符
() 匹配其整体为一个原子,即模式单元,可以理解为由多个单个原子组成的大原子
1限定符
限定符来指定正则表达式的一个给定原子必须出现多少次才能满足匹配
有* + ? {n} {n,} {n,m} 6种
2边界限制
有来限定字符串或单词的边界范围,以获得更准确的匹配结束
^ $分别指字符串的开结与结束
\b 用于描述字符串中每个单词的前或后边单
\B 表示非单词边界
字符串 this is a test
'/^this/' --匹配此字符串是否是以字符串"this"开始的,匹配成功
'/test$/' --匹配此字符串是否是以字符串"test"结束的,匹配成功
'/\bis\b/' --匹配字符串中是否含有单词"is",因为字符串"is"两边都需要有边界
'/\Bis\b/' --查找字符串"is"时,左边不能为边界而右边必须有边界,如"this"匹配成功
3句号(.)
在字符类之外,模式中的圆点可以匹配目标中的任何一个字符,包括不可打印字符。
但不匹配换行符(默认情况下),相当于"[^\n]"(Unix系统)或"[^\r\n]"(Windows系统)。
处理.与^和$是完全独立的,唯一的联系就是它们都涉及换行符
'/a.b/' --匹配在a和b之间任意一个字符的字符串
4模式选择符(|)
竖线字符"|"用来分隔多选一模式
例:
"LAMP|J2EE"表示可匹配LAMP或J2EE,因为元字符竖线"|"的优先级是最低的
5模式单元
模式单元是使用元字符"()"将多个原子组成大的原子,被当成一个单元独立使用。与数学表达式中的括号作用类似,一个模式中的表达式将被优先匹配
例:
'/(very)* good/' --可匹配 good,very good,very very good,very very …… good
6后向引用
一个正则表达式模式或部分模式两边添加圆括号装将导致相关匹配存储到一个临时缓冲区中,可以被获取供以后使用,所捕获的每个子匹配都按照在正则表达式模式中从左至右所遇到的内容存储,存储子匹配的缓冲区编号从1开始,连续编号直至最大99个子表达式,用\n型式引用,在正则表达式中成\\n
例:
'/^\d{4}\W\d{2}\W\d{2}$/' -- 2000-01/01能匹配
'/^\d{4}(\W)\d{2}\\1\d{2}$/' -- 2000-01-01
当需要使用模式单元而又不想存储匹配结果时,可以使用非捕获元字符"?:","?=","?!"来忽略相关匹配的保存。
'/(Windows)(Linux)\\2OS/'
'/(?:Windows)(Linux)\\1OS/'
7模式匹配的优先级
相同优先级从左向右,不同从上到下
\ 转义字符
() (?:) (?=) [] 模式单元和原子表
* + ? (n) (n,) (n,m) 重复匹配
^ $ \b \B \A \Z 边界限制
| 模式选择
2.4模式修正符
模式修正符在正则表达式定界符之外使用(最后一个斜线"/"之后)
模式修正符可以调整正则表达式的解释,扩展了正则表达式的在匹配,替换等操作时某些功能,而且模式修正符也可以组合使用,更增强了正则表达式的处理能力。
i 在和模式进行匹配时不区分大小写
m 将字符串视为多行,默认的正则开始"^"和结束"$"将目标字符串作为单一的"行"字符
s 模式中的画点元字符"."匹配所有的字符,包括换行符。
x 模式中的空白忽略不计,除非它已经被转义
e 只用在preg_replace()函数中,在替换字符串中对逆向引用做正常的替换,将其作为PHP代码求值,并用其结果来替换所搜索的字符串
U 本修正符反转了匹配数量的值使其不是默认的重复,而变成后面跟上"?"才变得重复。
D 模式中的美元元字符仅匹配目标字符串的结尾。没有此项时,如果最后一个字符是换行符的话,美元符号也会匹配此字符之前。