(独孤九剑)--正则表达式
【一】适用场景
邮箱验证,手机号码,验证码,替换敏感词(骂人换成**),文档采集,表情替换技术(早期),模板引擎解析
【二】定界符
定界符就是用来定义边界
注意:定界符不能用a-zA-Z0-9和 \和(),其他都可以用,但必须成对出现,又开始有结束
区分 \ 和 /,\ 为转义字符, / 为正则字符
转义字符:将 / 转为字符串形式,因为例如$str = '/ / /'这种形式的正则无法识别中间的/,所以需要 \ 转义字符,将中间的 / 转义为符号才能使用。
例如需要正则匹配 \ 时:
$str = '/ \/ /';
或者
$str = "/ '/' /";
或者修改定界符
$str = "@ / @"
定界符写法举例:
<?php $str = '% %'; $str = '^ ^'; $str = '$ $'; $str = '/ /'; $str = '@ @';
$str = '# #'; $str = '( )';//错误 $str = 'A A';//错误 ?>
最常用的为/
【三】元字符
^,\d及$等符号代表了特定的匹配意义,我们称之为元字符,常见元字符有
. 除换行符外任意字符;
\w a-zA-Z0-9(字母或数字、下划线);-----word字母
\s 空白符\n,\t,\r,空格;-----------------spacing间隙
空白符是指空格符' '、水平制表符'\t'、垂直制表符'\v'、换行符'\n'、回车符'\r'、换页符'\f'之类的字符
\d 0-9数字;---------------------------digit数字
\b 词边界(单词的开始或结束);---------begin开始
^ 字符串开始;
$ 字符串结束;
[x] 匹配x字符,如匹配字符串里的a,b,c字符;
\W \w的转义,除了a-zA-Z0-9之外的任意字符;
\S 匹配任何非空白的字符;
\D 0-9以外,匹配任何的字符;
\B 非边界(匹配不是单词开头或结束位置的字符);
[^x] 匹配除了x以外任意字符,如[^abc]匹配除了abc以外任意字符
例如:[^0-9a-zA-Z]中因为有抑扬符,所以变成了匹配0-9a-zA-Z之外的字符
注意:
①当我们要匹配这些元字符的时候,我们需要用到字符转义功能,同样正则表达式里面用 \ 来表示转义,如要匹配 . 符号,则需要用 \. ,否则 . 会被解释成“除换行符外的任意字符”。当然,要匹配 \ ,则需要写成 \\
②连续的数字或字母可以用 – 符号连接起来,如 匹配所有的小写字母,[1-5] 匹配 1 至 5 这 5 个数字
【四】正则表达式中的原子(最小单位)
原子是正则表达式的最小单位,一个成立的正则表达式必须至少包含一个原子
包含:空格,a-zAZ,换行,0-9,中文,标点符号,特殊符号等全为原子
原子等价式:
\d 0-9
\w a-zA-Z0-9
\s \t,\n,\v,\r,空格
\D [^0-9]
\W [^a-zA-Z0-9]
\S [^\t\n\f\r]
【五】循环字符
正则表达式用一些重复规则来表达循环匹配
常用的重复如下:
* 重复0次或更多次;
+ 重复1次或更多次;
? 重复0次或1次;
{n} 有且只能重复n次;
{n,} 至少重复n次;
{n,m} 可以重复n到m次;
<?php if (preg_match("/\w?/", "2kkk6k3",$match)) {//匹配0或1次,所以会输出2 print_r($match); }else{ print_r("匹配失败"); } ?>
【六】正则函数
preg_match() 第一次匹配成功后就会停止匹配,如果要实现全部结果的匹配,即搜索到subject结尾处,则需使用 preg_match_all() 函数
(1)php匹配正则函数:preg_match()
preg_match() 函数用于进行正则表达式匹配,成功返回 1 true,否则返回 0 false。
preg_match() 匹配成功一次后就会停止匹配,如果要实现全部结果的匹配,则需使用preg_match_all() 函数。
语法:preg_match(正则表达式,匹配变量,存储匹配结果的数组)
<?php if (preg_match("/IT/i", "hiTony",$match)) { print_r($match);//输出匹配结果 }else{ print_r("匹配失败"); } ?>
(2)preg_match_all()
preg_match_all() 函数用于进行正则表达式全局匹配,成功返回整个模式匹配的次数(可能为零),如果出错返回 FALSE
【七】模式修正符
模式修正符是标记在整个正则表达式之外的,可以看着是对正则表达式的一些补充说明
常用的模式修正符如下:
i 模式中的字符将同时匹配大小写字母
if (preg_match("/ABC/i", "abc",$match)) { print_r($match); }else{ print_r("匹配失败"); }
m 字符串视为多行
s 将字符串视为单行,换行符作为普通字符
x 将模式中的空白忽略
e preg_replace() 函数在替换字符串中对逆向引用作正常的替换,将其作为 PHP 代码求值,并用其结果来替换所搜索的字符串。
A 强制仅从目标字符串的开头开始匹配
D 模式中的 $ 元字符仅匹配目标字符串的结尾
U 匹配最近的字符串
u 模式字符串被当成 UTF-8
【八】或者(分枝)
分枝是指制定几个规则,如果满足任意一种规则,则都当作匹配成功。具体来说就是用 | 符号把各种规则分开,且条件从左至右匹配。
提示:分枝规定,只要匹配成功,就不再对后面的条件加以匹配,所以如果你想匹配有包含关系的内容,请注意规则的顺序。
下面是一个使用分枝的例子。
美国的邮政编码的规则是 5 个数字或者 5 个数字连上 4 个数字,如 12345 或者 54321-1234 ,如果要匹配所有的邮编,则正确的正则表达式为:
\d{5}-\d{4}|\d{5}
【九】常用正则
邮箱,手机号,网址,自定义格式,采集器
【十】正则练习
(1)必须以start开始,以end结束,中间有一个或更多数字
<?php $pattern = '/^start\d+end$/'; $string1 = "start666end"; if (preg_match($pattern,$string1,$match)) { print_r($match); }else{ print_r("匹配失败"); } ?>
(2)必须以end结束
$pattern = '/start\d+end$/';
(3)必须以start开始
$pattern = '/^start\d+end/';
(4)匹配非数字,即字母。以字母开始以字母结束(只能匹配一个)
$pattern = '/^[^0-9]$/'; $string1 = "a"; //匹配成功
(5)匹配非数字,即字母。以字母开始以字母结束(能匹配多个)
$pattern = '/^[^0-9]+$/'; $string1 = "abc"; //匹配成功