正则表达式
# 基础概念
- 正则表达式的作用:分割、查找、匹配、替换
- 分隔符:正斜线(/)、hash符号(#)、取反符号(~)
- 通用原子:\d、\D、\w、\W、\s、\S
- 元字符:* ? $ + {n}, {n,m} [] () [^] | [-]
- 模式修正符:i m e s U x A D u
# 后向引用
使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是: 从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。后向引用用于重复搜索前面某个分组匹配的文本。
// 后向引用
$str = "<b>abc</b>";
$pattern = '/<b>(.*)<\/b>/';
// abc
preg_match($pattern,$str,$match);
1
2
3
4
5
2
3
4
5
# 贪婪模式
贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配。非贪婪模式只被部分NFA引擎所支持。
// 贪婪模式
$str = "<b>abc</b><b>bcd</b>";
$pattern = '/<b>.*?<\/b>/';
preg_match($pattern,$str,$match);
1
2
3
4
2
3
4
# 正则示例
// 中文匹配
$str = "中国人";
// 匹配utf-8编码的中文
// $pattern = '/[\x{4e00}-\x{9fa5}]+/u';
$pattern = '/.*/';
// 匹配GBK312
$pattern = '/['.chr(0xb0).'-'.chr(0xf7).']['.chr(0xa1).'-'.chr(0xfe).']/';
preg_match($pattern,$str,$match);
// 匹配139开头的长度为11位的手机号
$mobile = "13951097729";
$pattern = '/^139\d{8}$/';
preg_match($pattern,$mobile,$match);
// 匹配src标签
$str = '<img alt="高清大图" src="./test.img">';
$pattern = '/<img.*?src=(.*?)>/';
preg_match($pattern,$str,$match);
var_dump($match);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1、写一个匹配邮箱的正则表达式?
[\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?
1
2、写一个经纬度的正则表达式?
上次更新: 2020/12/31, 06:55:18