结构
定界符:多种都可以,常用为//
原子:最少的一个匹配单位(放在定界符中),在一个正则表达式中,至少要有一个原子
元字符:元字符不能单独使用,修饰原子,是用来扩展原子功能和限定功能的,(写在定界符号中)
模式修正符号:修正,对模式(正则)修正,(写在定界符号右边)
备注:
1.正则表达式为一个字符串,单引号双引号有区别,优先使用单引号(双引号内认转义字符,单引号内不认转义字符)
2.定界符不仅局限于“//”。除了字母,数字和斜线“\”以外的任何字符都可以作为定界符,像“#”,“|”,“!”等都可以的。
3.打印字符指键盘上所有可以显示出来的字符,非打印值无法显示的字符,比如,回车,换行
4.\转义字符,
(1)可以将有意义的字符转成没有意义的原子字符(将有意义变为原子)。
(2)可以将没有意义的字符转成有意义的原子(比如:\t,tab键)
(3)所有没有意义的字符,加了转义也没有意义的,可加可不加(比如:/a/和/\a/,/@/和/\@/,/9/和/\9/),php有个函数专门识别那些属于有意义的字符
5.常用非打印字符
非打印字符 | 含义描述 |
\cx | 匹配由x指明的控制字符。如\cM匹配一个Control-M或回车符。x的值必须为A~Z或a~z之一 |
\f | 匹配一个换页符。等价于\x0c或\cL |
\n | 匹配一个换行符。等价于\x0a或\cJ |
\r | 匹配一个回车符。等价于\x0d或\cM |
\t | 匹配一个制表符。等价于\x09或\cI |
\v | 匹配一个垂直制表符。等价于\x0b或\cK |
.
一:原子
原子是正则表达式的最近本的组成单元,而且在每个模式中最少要包含一个原子。原子是有所有那些未显示指定为元字符的打印和非打印字符组成,具体分为5类。
1.普通字符作为原子:如a~z,A~Z,0~9等
2.一些特殊字符和转义后元字符作为原子:
所有标点符号,但语句特殊意义的符号需要转义后才可以作为原子,如:\”\’\*\+\?\.等
3.一些非打印字符作为原子:如:\f\n \r\t\v\cx
4.使用“通用字符类型”作为原子:如:\d\D\w\W\s\S
原子 | 含义描述 |
\d | 代表任意一个数字,等价于[0-9] |
\D | 代表任意一个非数字,等价于[^0-9] |
\w | 代表任意一个字 a-z A-Z 0-9 _,等价于[a-zA-Z0-9_] |
\W | 代表任意一个非字 除了 a-z A-Z 0-9 _之外的所有字符,等价于[^a-zA-Z0-9_] |
\s | 代表空白,回车,换行等非打印字符都算空白,等价于[\t\n\f\v]等,这里未全部列完 |
\S | 代表非空白,等价于[^\t\n\f\v]等,这里未全部列完 |
5.自定义原子表([])作为原子:如:’/[apj]sp/’ ‘/[^apj]sp’
(1)-从那到那区间范围,如:[a-zA-Z]
(2)^除列表中的,如:[^-zA-Z]
6.点(.)代表所有的
二:元字符
元字符 | 含义描述 |
* | 匹配0次.1次或多次其前的原子,等同于{0,} |
+ | 匹配1次或多次其前的原子,等同于{1,} |
? | 匹配0次或1次其前的原子,等同于{0,1} |
| | 匹配两个或多个分支选择,|的优先级是最低的 |
{n} | 表示其前面的原子恰好出现n次 |
{n,} | 表示其前面的原子出现不小于n次(注意:{,m}没有这种写法) |
{n,m} | 表示其前面的原子至少出现n次,至多出现m次 |
^或\A | 匹配输入字符串的开始位置(或在多行模式下行的开头,即紧随一个换行符之后) |
$或\Z | 匹配输入字符串的结束位置(或在多行模式下行的结尾,即紧随一个换行之前) |
\b | 匹配单词的边界 |
\B | 匹配除单词边界以外的部分,举例:”this is island”,匹配this中is(/\Bis\b/),匹配is(/\bis\b/),匹配island中的is(/\bis\B/) |
() | 匹配其整体为一个原子,即模式单元,可以理解为由多个单个原子组成的大原子 |
.
三:括号()的作用
1.改变优先级别,例如:’/oracle|mysql/’和’/orac(le|my)sql/’
2.将小原子变成大原子,例如:’/mysql*/’和’/(mysql)*/’
3.子模式,整个表达式是一个大的模式,小括号中是每个独立的子模式,要禁用当前括号的子模式时在括号内前部加上’?:’例如/(?:\d{4})(-|\/)\d{2}(-|\/)\d{2}/
4.反向引用,例如匹配日期,’2017-08-22’或者’2017/08/22′,此时用’/\d{4}(-|\/)\d{2}(-|\/)\d{2}/’是无法保证分隔符相同,同时为’-‘或者同时为’/’,此时就要用到子模式,把匹配第二个连接符的地方'(-|\/)’更换为’\1’,即为’/\d{4}(-|\/)\d{2}\1\d{2}/’,1代表第一个括号括号对应的规则。在替换函数内’\1’也可以写为’${1}’格式
5.注释,语法:(?#comment),例如:’/.*(?#random)/’
四:模式修正符号
模式修正符 | 含义描述 |
i | 修正正则表达式,使其不区分大小写(默认是区分大小写的) |
m | 修正正则表达式,可以视为多行(默认视整个字符串为一行),在使用’^’或’$’这两个符号时,每一行满足都可以 |
s | 修正正则表达式中的点 . 可以匹配换行符号(默认 . 不能匹配回车符号) |
x | 修正正则表达式,可以省略空白,例如:’/web server/x’等同于’webserver’ |
U | 取消贪婪模式,(.*,.+)正则表达式比较贪婪,通常在’*+’后面加’?’来取消贪婪模式,如果已经有’?’了再加上了’U’,那么效果又变为贪婪模式,类似于负负得正 |
$str='this <b>is</b> a test <b>web</b> server'; $reg='/\<b\>.*\<\/b\>/'; preg_match_all($reg,$str,$attr); //匹配结果是'is a test web',但是我们想要的是'is'和'web' //此时正则表达式修改为'/\<b\>.*\<\/b\>/U'. //但是更常用的方式是不加模式修正符,而是在*后加上?取消贪婪模式,'/\<b\>.*?\<\/b\>'