一、什么是正则表达式?
正则表达式是用于描述字符排列和匹配模式的一种语法规则,主要用于字符串的模式分割、匹配、查找及替换操作
二、为什么使用正则表达式?
PHP有一套非常丰富的字符串处理函数,但是这些函数还远远不够,满足不了对字符串处理的要求,这时需要使用正则表达式对字符串进行分割、匹配、查找、替换
三、什么时候使用正则表达式?
①表单的验证
②伪静态(URL重写)
③文章内容的采集
四、如何使用正则表达式?
1、PHP正则表达式的函数库:PCRE(推荐,兼容Perl,大多数语言都使用这套库)、POSIX
PCRE库:
preg_match($pattern ,$str ,$match_array ,$flags=0 ,$offset=0) 进行单次正则表达式匹配,在第一次匹配到后即停止搜索匹配;匹配成功返回1,未匹配到返回0
$pattern:指定匹配的正则表达式字符串
$str:输入的字符串
$match_array:可选参数,$match_array[0]为正则表达式在字符串中匹配到的所有文本,$match_array[1]及其后为正则表达式中每个模式单元在字符串中匹配到的文本
$flags:可选参数,默认值为0,若值为 PREG_OFFSET_CAPTURE 时,则$match_array中每个出现的匹配字符串后一个元素值为该字段在原目标字符串中的位置偏移量值
$offset:可选参数,默认值为0,表示从目标字符串的开始位置进行匹配搜索
preg_match_all($pattern ,$str ,$match_array ,$flags=PREG_PATTERN_ORDER ,$offset=0) 进行全局正则表达式匹配,连续搜索匹配直至目标字符串结尾;返回完整匹配次数(可能是0,未匹配到),发生错误返回false
$pattern:指定匹配的正则表达式字符串
$str:输入的字符串
$match_array:可选参数,多维数组,输出所有匹配到的文本,数组排序由参数$flags决定
$flags:可选参数,默认值为 PREG_PATTERN_ORDER,结果排序为$match_array[0]保存所有匹配的文本,$match_array[1]往后保存正则表达式中每个模式单元匹配到的文本;若为 PREG_SET_ORDER,结果排序为$match_array[0]保存第一次的匹配文本及各单元匹配文本,$match_array[1]保存第二次的匹配文本及各单元匹配文本,以此类推;若为 PREG_OFFSET_CAPTURE,$match_array中每次匹配返回时增加其在目标字符串的位置偏移量值
$offset:可选参数,默认值为0,表示从目标字符串的开始位置进行匹配搜索
preg_replace($pattern ,$replace ,$subject ,$limit=-1 ,&$count) 执行正则表达式的搜索和替换,替换成功返回替换后的字符串或字符串数组,替换失败返回原目标字符串或目标字符串数组
$pattern:指定匹配的正则表达式,可以为一个字符串也可以为一个字符串数组
$replace:用于替换的字符串或字符串数组;若该参数为字符串且参数$pattern为数组,那么所有匹配都使用这个字符串进行替换;若该参数和参数$pattern都是数组,则每个匹配使用该数组中对应元素进行替换;若该参数中的元素比数组$pattern中的元素少,则多出来的匹配使用空字符串进行替换
$subject:要进行搜索和替换的目标字符串或字符串数组,返回值也对应为字符串或字符串数组
$limit:可选参数,默认值为-1(无限),每个匹配在每个目标字符串或目标字符串数组上进行替换的最大次数
$count:可选参数,若指定该参数,则该参数返回为完成替换的次数值
preg_split($pattern ,$str ,$limit=-1 ,$flags=0) 用正则表达式分割字符串,分割成功返回分割后的各字符串组成的数组,分割失败返回单个元素值为原输入字符串的数组
$pattern:指定匹配的正则表达式字符串
$str:输入的字符串
$limit:可选参数,默认值为-1(不限制),限制分割后得到的子串最多只有$limit个,最后一个将包含所有剩余部分,值为-1、0或NULL时都表示不限制;
$flags:可选参数,默认值为0,可为 PREG_SPLIT_NO_EMPTY(返回分割后的非空部分)、PREG_SPLIT_DELIM_CAPTURE(用于分割的表达式中的括号将被捕获并返回)、PREG_SPLIT_OFFSET_CAPTURE(每个返回的匹配都会增加位置偏移量的元素)标记的组合
preg_grep($pattern ,$arr ,$flags=0) 返回目标数组中与正则表达式匹配的数组条目,为一个以原目标数组中key为索引的新数组
$pattern:指定匹配的正则表达式字符串
$arr:输入的数组
$flags:可选参数,默认值为0,若为 PREG_GREP_INVERT,则函数返回输入数组中与指定的正则表达式不匹配的元素组成的数组
preg_replace_callback($pattern ,$callback ,$subject ,$limit=-1 ,&$count) 用回调函数执行正则表达式的搜索和替换,替换成功返回替换后的字符串或字符串数组,替换失败返回原目标字符串或目标字符串数组
$pattern:指定匹配的正则表达式,可以为一个字符串也可以为一个字符串数组
$callback:一个回调函数,回调函数的参数为目标字符串或目标字符串数组$subject中与正则表达式匹配的数组结果,回调函数的返回值为真正参与替换的字符串;
$subject:需要搜索替换的目标字符串或目标字符串数组
$limit:可选参数,默认为-1(无限制),每个匹配在每个目标字符串或目标字符串数组上进行替换的最大次数
$count:可选参数,若指定该参数,则该参数返回为完成替换的次数值
2、正则表达式的语法规则的组成部分
①定界符
除了数字、字母和反斜线“\”之外的特殊字符均可作为定界符,一般使用斜线“/”
②原子
1.普通字符:"/a~z/" "/A~Z/" "/0~9/"
2.特殊字符:"/\"/" "/\'/" "/\*/" "/\+/" "/\?/" "/\./"
3.非打印字符:"/\n/" "/\f/" "/\r/" "/\t/" "/\v/" "/\cx/"
4.通用字符:
"/\d/" 匹配任意的一个数字
"/\D/" 匹配除数字之外的任意字符
"/\w/" 匹配数字、大小写字母、下划线
"/\W/" 匹配除了数字、字母、下划线的字符
"/\s/" 匹配空白符(非打印字符、空格)
"/\S/" 匹配除空白符之外的任意字符
5.匹配中文:"/[\u4e00-\u9fa5]/"
③元字符
* 匹配0次、1次或多次其前的原子
+ 匹配1次或多次其前的原子
? 匹配0次或1次其前的原子
. 匹配除换行符之外的任意一个字符
| 或
{n} 其前的原子出现恰好等于n次
{n,} 其前的原子出现≥n次
{n,m} 其前的原子出现次数≥n,≤m
^ 或 \A 匹配输入字符串的开始字符,必须以其后的原子开头
$ 或 \Z 匹配输入字符串的结束字符,必须以其前的原子结尾
\b 匹配单词开头或结尾的所含字母,该单词必须包含该字母(\b放开头则匹配开头,放结尾则匹配结尾)
\B 匹配单词开头或结尾不可含的字母,且该单词还必须包含该字母(\B放开头则匹配开头,放结尾则匹配结尾)
[ ] 匹配方括号中的任一原子,方括号中的特殊字符可自动转义为无特殊意义的原字符,无需用“\”转义
[^] 匹配方括号中原子以外的任一字符
( ) 将括号中的多个原子组成为一个整体原子(模式单元),反向引用中会使用各单元对应的返回值
.* 贪婪模式,会重复匹配原子值
.*? 取消贪婪模式,只匹配首次匹配到的原子值
④模式修正符
注意:模式修正符须放在定界符的外面,如"/ /i"
i 正则表达式内的英文不区分大小写
m 在字符串中存在换行符\n时,会将字符串拆分成多行,对每行分别匹配
s 使“.”可以匹配所有字符,包括换行符
x 将正则表达式中的空格取消掉
U 作用相当于 .*? 但不可与 .*? 同时使用
D 不加D,$忽略字符串末尾的换行符;加上D,$也会匹配末尾的换行符
e 相当于函数 eval($str);将字符串作为PHP代码执行,只用在 preg_replace() 函数中对第二个参数作用
例:echo preg_replace($pattern,'\'<a href="$0">\'.strtoupper("$0").\'</a>\'',$str);