【php】正则表达式
一、生活当中的正则表达式:
a)Notepad++、word等这些具有编辑功能的软件,都具有一个查找、替换的功能,这个功能,其实就属于正则模式的一种匹配、替换;包括windows当中可以实现的查找,也是应用的正则模式匹配;包括一些搜索、匹配的软件也是使用的正则模式规则来写的!
二、PHP当中的正则:
a)定义:它是用于对使用一种模式,对一段字符串进行的查找、替换、匹配、分割的作用
三、正则模式:
a)其实就是一段特殊的字符串!我们可以使用这一段特殊的字符串对另一段字符串进行的一系列操作!
b)模式:
i.单身模式:找女朋友,学习,充实自己!
ii. 恋爱模式:此刻仉浩焱和他的女朋友在热恋期,此时他们的智商都为0
iii.婚姻模式:此刻仉浩焱和他的女朋友结婚啦,从此过上了幸福的生活!
iv.侦查模式:此时他媳妇的智商仅次于爱因斯坦,她会从仉浩焱的蛛丝马迹发现海波是不是偷腥了~~(头发丝儿、身上是否有香水味、是否有口红…)
四、正则的分类:
a)POSIX规则:
i.已弃用,(功能、使用频率)比较落后,因此弃用
b)PCRE规则:
i.正在使用!
五、如何来使用正则表达式?
a)正则的定界符:
b)原子:
c)元字符:
d)模式修正符:
e)配合正则函数来进行使用!
i.Preg_match() 匹配一次
ii.Preg_match_all() 匹配所有
六、定界符:
a)和定义字符串一样,我们定义正则也需要使用正则的定界符
b)“/正则模式/” ,正则当中的定界符可以是除了字母、数字、具有特殊含义符号之外的所有内容,都可以作为定界符
c)注意:通常情况下,我们都会使用双斜线作为正则模式的定界符,这是一个不成文的规定!
七、 原子:是正则模式当中最小的单位!
a) 普通字符:
1. a-z:之中的所有小写字母,都是一个原子
2. A-Z:之中的所有大写字母,都是一个原子
3. 0-9:之间的所有阿拉伯数字,都属于一个原子
b) 原子表:
1. []:一个方括号当中所有的内容之间的关系都是或的关系,而且一个原子表永远代表一个原子!
2. [abcdfg]:可以写单个原子
3. [a-z]:任一一个小写字母
4. [A-Z]:任一一个大写字母
5. [0-9]:任一一个阿拉伯数字
6. [a-g]:任一一个从a-g之间的小写字母
7. 原子表中如果有一个 ‘-’代表了一个范围!
c) 特殊的转义字符:
1. \d:相当于[0-9],代表了任意一个阿拉伯数字
2. \D:代表了任一一个除了阿拉伯数字的内容
3. \w:代表了任意一个字母、数字、下划线的内容
4. \W:代表了除了任意的字母、数字、下划线的内容
d) 非打印字符:
1. \r:回车
2. \n:换行
3. \t:制表符
e) 正则当中拥有特殊含义的字符:
1. *、.、+、?、\,当我们想要使用正则模式去匹配这些具有特殊含义的字符时,我们需要在它前方加上转义字符 \
八、 元字符:在正则表达式当中,那些拥有特殊含义的字符,就是元字符
a) []:原子表,特点:原子表中的原子之间的关系是或,一个原子表代表一个原子
b) {n}:匹配次数:花括号之前的原子必须出现n次
c) {n,}:匹配次数:花括号之前的原子至少出现n次,没有上限
d) {n,m}:匹配次数:花括号之前的原子至少出现n次,最多出现m次
e) .:代表任意一个原子
f) *:匹配次数:代表*号之前的原子是任意长度,相当于{0,}
g) +:匹配次数:代表+号之前的原子是至少一次,没有上限,相当于{1,}
h) ?:匹配次数:代表?号之前的原子可有可无,相当于{0,1}
i) ^:两层含义
i. 如果将其放在正则模式左定界符后,则代表以^之后的原子开头
ii. 如果将其放在原子表中最开头,[^0-9],则代表原子表中的内容取反
j) $:如果将其放在正则模式右定界符前,则代表以$符之前的原子结尾
i. 注意:如果配合使用上箭头^和美元符号$,则代表精确匹配,代表我们匹配的字符源必须符合他们中间的正则模式的内容!
k) ():三层含义:
i. 提升优先级
ii. 子存储
iii. 重复使用模式单元
l) |:或者
九、 关于正则模式的特殊运用:
a) 贪婪匹配
1 // 定义字符源 2 $stu = '#仉浩焱##许超##张舒##大嘴##小花##伟哥#'; 3 4 // 定义正则模式(这属于贪婪匹配) 5 $patt = "/#.*#/"; 6 var_dump($res); 7 8 //结果 9 array (size=1) 10 0 => 11 array (size=1) 12 0 => string '#仉浩焱##许超##张舒##大嘴##小花##伟哥#' (length=51) 13 14 // 定义正则模式(拒绝贪婪匹配) 15 $patt = "/#.*?#/"; 16 17 // 使用正则函数来进行匹配 18 preg_match_all($patt,$stu,$res); 19 var_dump($res); 20 21 //结果 22 array (size=1) 23 0 => 24 array (size=6) 25 0 => string '#仉浩焱#' (length=11) 26 1 => string '#许超#' (length=8) 27 2 => string '#张舒#' (length=8) 28 3 => string '#大嘴#' (length=8) 29 4 => string '#小花#' (length=8) 30 5 => string '#伟哥#' (length=8)
b) 子存储
c) 重复使用模式单元
十、 正则当中的函数:
a) Preg_match()、 执行一个正则表达式匹配
1 //定义字符源 2 $str = "abcdefgabcdefg"; 3 4 //定义正则模式 5 $patt = "/a/"; 6 7 echo preg_match($patt,$str,$res); 8 var_dump($res); 9 //array (size=1) 10 //0 => string 'a' (length=1)
b) Preg_match_all()、 执行一个全局正则表达式匹配
1 //定义字符源 2 $str = "abcdefgabcdefg"; 3 4 //定义正则模式 5 $patt = "/a/"; 6 7 //匹配所有 8 preg_match_all($patt,$str,$res); 9 var_dump($res); 10 11 //array (size=1) 12 0 => 13 array (size=2) 14 0 => string 'a' (length=1) 15 1 => string 'a' (length=1)
c) Preg_grep(); 返回匹配模式的数组条目
d) Preg_replace(); 执行一个正则表达式的搜索和替换
e) Preg_split(); 通过一个正则表达式分隔字符串
十一、 正则当中的模式修正符:
a) i:不区分大小写
1 //模式修正符i:表示正则匹配不区分大小写 2 $str = "abcdefgABCDEFG"; 3 $patt = "/[a-z]/i"; 4 preg_match_all($patt,$str,$res); 5 var_dump($res); 6 7 //结果 8 array (size=1) 9 0 => 10 array (size=14) 11 0 => string 'a' (length=1) 12 1 => string 'b' (length=1) 13 2 => string 'c' (length=1) 14 3 => string 'd' (length=1) 15 4 => string 'e' (length=1) 16 5 => string 'f' (length=1) 17 6 => string 'g' (length=1) 18 7 => string 'A' (length=1) 19 8 => string 'B' (length=1) 20 9 => string 'C' (length=1) 21 10 => string 'D' (length=1) 22 11 => string 'E' (length=1) 23 12 => string 'F' (length=1) 24 13 => string 'G' (length=1)
b) s:表示忽略换行符
//模式修正符s:表示正则匹配忽略换行符 $str = " <li>张三</li> <li>李四 </li> <li>王五</li> "; //不加模式修正符s $patt = "/<li>.*?<\/li>/"; preg_match_all($patt,$str,$res); var_dump($res); //结果 array (size=1) 0 => array (size=2) 0 => string '<li>张三</li>' (length=15) 1 => string '<li>王五</li>' (length=15) //加模式修正符s $patt = "/<li>.*?<\/li>/s"; preg_match_all($patt,$str,$res); var_dump($res); //结果 array (size=1) 0 => array (size=3) 0 => string '<li>张三</li>' (length=15) 1 => string '<li>李四 </li>' (length=20) 2 => string '<li>王五</li>' (length=15)
c) U:表示拒绝贪婪匹配
1 //模式修正符U:表示正则拒绝贪婪匹配 2 $str = "#海波##鸿泽##柏岩##景飞#"; 3 $patt = "/#.*#/U"; 4 preg_match_all($patt,$str,$res); 5 var_dump($res); 6 7 //结果 8 array (size=1) 9 0 => 10 array (size=4) 11 0 => string '#海波#' (length=8) 12 1 => string '#鸿泽#' (length=8) 13 2 => string '#柏岩#' (length=8) 14 3 => string '#景飞#' (length=8)
十二、 关于正则和字符串函数:
a) 正则函数就相当于大炮:
b) 字符串函数就相当于弓箭: