正则表达式考点
引子: 至少写出一种验证139开头的11位手机号的正则表达式的
正则表达式的作用: 分割, 查找,匹配,替换字符串
分隔符: 正斜线(/), hash符号(#),取反(~)
通用原子: \d(10进制0-9), \D, \w(数字字母下划线), \W(\w取反), \s(空白符), \S
\d | 10进制0-9 |
\D | 任意一个非十进制数字 |
\w | 数字字母下划线 |
\W | 任意个非单词字符 |
\s | 任意一个空白字符(空格、换行符、换页符、回车符、字表符) |
\S | 任意一个非空白字符 |
补充:不可见字符:
字符 | 含义 |
---|---|
\a | 报警 |
\b | 退格 |
\f | 换页 |
\n | 换行 |
\r | 回车 |
\t | 字表符 |
元字符:
. | 除换行符之外的任意字符 |
* | 前面的内容出现 大于等于0次 |
? | 前面的内容出现0次或者1次 |
^ | 必须以其开头 |
+ | 前面的内容出现1次或者多次 |
{n} | 前面的内容恰巧出现n次 |
{n,} | 前面的内容出现大于等于n次 |
{n,m} | 前面的内容出现次数介于n和m中间 |
[] | 匹配一个集合,[123]表示匹配1,2,3 |
() | 后向引用或者可以当做一个整体 |
[^] | [^123], 除了1,2,3之外的字符 |
| | 或者 |
[-] | [1-9] 数字1到9 |
$ | 必须以其结尾 |
模式修正符:
i | 不区分大小写 |
m | 通过分隔符进行分割 |
e | 对匹配出的内容进行处理,php7已经remove |
s | 修正换行 |
U | 取消贪婪模式 |
x | 忽略模式中的空白符 |
A | 必须以模式开头 |
D | 修正模式对反斜杠的忽略 |
u | 对中文进行匹配的时候能用到 |
后向引用
$str = '<b>abc</b>';
$pattern = '/<b>(.*)<\/b>/';
preg_replace($pattern, '\\1', $str );//匹配abc
贪婪模式
$str = '<b>abc</b><b>bcd</b>';
$pattern = '/<b>.*?<\/b>/';//取消贪婪模式
//$pattern = '/<b>.*</b>/U';//取消贪婪模式
preg_replace_all($pattern, '\\1', $str); //匹配出abc和bcd
正则表达式pcre函数
preg_match,preg_match_all, preg_replace, preg_replace_all
中文匹配
utf-8 汉字编码范围: 0x4e00-0x9fa5 需要使用u模式修正符使字符串被当成utf-8
ANSI(gb2312): 0xb0-0xf7, 0xa1-0xfe 需要使用chr将ascii码转码为字符
$str = '中文';
$pattern = '/[\x{4e00}-\x{9fa5}]+/u';
//$pattern = '['.chr(0xb0).'-'.chr(0xf7).']['.chr(0xa1).'-'.chr(0xfe).']';
preg_match($pattern, $str, $match);
回到最初的问题:
自左向右的顺序使用正则表达式的原子和元字符进行拼接,最终加入模式修正符
$str = '13988888888';
$pattern = '^139\d{8}$';
preg_match($pattern, $str, $match);
补充练习: URL, Email, IP, 手机号码等
请写出一个正则表达式,取出页面中所有img标签中的src值
$str = '<img alt='test' id='testId' src='test.jpg'/>';
$pattern = '/<img.*?src="(.*?)".*?\/?>/';
preg_match($pattern, $str, $match);
参考:
慕课网
https://www.cnblogs.com/hellohell/p/5718319.html
https://www.cnblogs.com/leezhxing/p/4333773.html