正则表达式的作用:
分割字符串、查找字符串、匹配字符串、替换字符串:简称->分割、查找、匹配、替换
正则表达式的分隔符:
正斜线(/),hash符号(#),取反符号(~)
通用原子
-
\d
: 十进制的0-9 -
\D
: 对\d取反:除了0-9 -
\w
: 数字、字母、下画线 -
\W
: 除了数字、字母、下画线 -
\s
: 空格、换行符、换页符、回车符、字表符 -
\S
: 除了空格、换行符、换页符、回车符、字表符
元字符
-
.
: 除了换行符之外的任意字符 -
*
: 匹配前面内容出现0次、1次或多次 -
?
: 匹配前面内容出现0次或1次 -
^
: 开头 - $ : 结尾
-
+
: 匹配前面内容出现1次或多次 -
{n}
: 出现n次 -
{n,}
:出现大于等于n次 -
{n,m}
: 出现大于等于n次 小于等于m次 -
[]
: 集合,匹配中括号里面的[abc]则是匹配a 或 b 或 c -
()
: 后向引用或当作整体 -
[^]
: 取反[^abc]除了a 、除了b、 除了c -
|
: 或者 -
[-]
: 表示范围;比如:[0-9],匹配的内容就是0,1,2,3,4,5,6,7,8,9
模式修正符
-
i
: 不区分大小写 -
m
: 多文本模式 -
s
: 单行模式 -
U
: 取消贪婪模式 -
x
: 忽略模式中的空白符 -
A
: 必须以该模式开头 -
D
: 模式中的美元元字符仅匹配目标字符串的结尾.如果这个修饰符被设置, 模式中的元字符美元符号仅仅匹配目标字符串的末尾. 如果这个修饰符 没有设置, 当字符串以一个换行符结尾时, 美元符号还会匹配该换行符(但不会匹配之前的任何换行符). 如果设置了修饰符m, 这个修饰符被忽略 -
u
: 进行utf-8匹配
后向引用
<?php $str = 'abaasdassdd'; $pa = '/([a-zA-Z])\1/'; echo preg_replace($pa, '7', $str); /* 小括号:(pattern):匹配对应的pattern,然后将匹配到的内容捕获到自动命名的组里 自动命名的组 :使用小括号指定一个子表达式后,匹配这个子表达式的文本可以在表达式或其它程序中作进一步的处理。 默认情况下,每个分组会自动拥有一个组号,规则是:以分组的左括号为标志,从左向右,第一个分组的组号为1, 第二个为2,以此类推。 后向引用:后向引用用于重复搜索前面某个分组匹配的文本。例如,\1代表分组1匹配的文本。 */ /* 在上面的例子中,小括号([a-zA-Z])匹配到的是所有的字母,\1的意思就是后向引用,这里只有一个小括号,也就是只有一组, 所以\1就是把小括号里的内容再次匹配一遍,注意,有些人容易钻牛角尖,比如这里第一次匹配的时候,匹配到的是字母a, 然后会把a再次放到小括号里面匹配一次,后面也一样,容易理解错的就是有些人容易会觉得第一次匹配到的是abaasdassdd, 然后第二次匹配到的是同样也就是abaasdassdd,不是这么匹配的,这样理解是绝对错误的
*/
?>
贪婪模式
$str = '<b>abc</b><b>bcd</b>';//匹配每一不b标签 $pattern = '/<b>(.*?)<\/b>/';//.*存在贪婪模式,会一直匹配到最后,加上问号后 取消贪婪模式,匹配一个之后再进行下一个匹配 preg_replace($pattern,'\\1',$str); //使用以下方法也可以取消贪婪模式 $pattern = '/<b>(.*)<\/b>/U'; //U和?不可以一起用
正则表达式函数
函数名 | 功能 |
---|---|
preg_filter | 执行一个正则表达式搜索和替换 |
preg_grep | 返回匹配模式的数组条目 |
preg_match | 执行一个正则表达式匹配 |
preg_match_all | 执行一个全局正则表达式匹配 |
preg_replace_callback_array | 传入数组,执行一个正则表达式搜索和替换使用回调 |
preg_replace_callback | 执行一个正则表达式搜索并且使用一个回调进行替换 |
preg_replace | 执行一个正则表达式的搜索和替换 |
preg_split | 通过一个正则表达式分隔字符串 |
例子
写出一个正则表达式,取出页面中所有img标签中的src值
$str = '<img alt="xxx" src="aaa.jpg" />'; $pattern = '/<img.*?src=["\'].*?["\'].*?\/?>/'; /** * 分析 * img的标签特性:有<img开头,中间可能有其他属性:所以有<img.*? * src标签:src=["\'].*?["\'] 可能是以单引号或双引号 * 后面可能还有别的属性:.*? * 以/> 或 >结尾: /?> * 最终拼接成:<img.*?src=["\'].*?["\'].*?\/?> **/
备注:
- 正则表达式可以写在单引号里面也可以写在双引号里面,但是双引号有时候解析不出来$符号
- 原子:最小的一个匹配单位(放在定界符中),一个正则表达式,至少要有一个原子
- 元字符:元字符不能单独使用,主要用途是修饰原子,是用来扩展原子功能的限制功能(放在定界符中)
- 模式修正符:就是用来修正正则表达式,模式修正符要写在定界符外面,写在右边
- 定界符:除了字母、数字和斜线"\"之外的任意字符都可以做定界符