- PHP常用的正则表达式函数
$parttern:正则表达式
$subject:匹配的内容
(1)preg_match 和preg_match_all
r e t u r n : 返 回 值 为 匹 配 到 结 果 的 次 数 p r e g m a t c h a l l 会 都 匹 配 所 有 的 结 果 , p r e g m a t c h 匹 配 到 第 一 个 相 同 的 就 进 行 返 回 , 最 多 匹 配 一 次 , return:返回值为匹配到结果的次数 preg_match_all会都匹配所有的结果,preg_match匹配到第一个相同的就进行返回,最多匹配一次, return:返回值为匹配到结果的次数pregmatchall会都匹配所有的结果,pregmatch匹配到第一个相同的就进行返回,最多匹配一次,return只可能返回1或0.
示例:
//正则表达式
//匹配0-9中的任意一个数字
$pattern = '/[0-9]/';
$subject = 'zhao9hfhf7shshsh0shyune8';
$data1 = preg_match($pattern,$subject,$res1);
$data2 = preg_match_all($pattern,$subject,$res2);
var_dump($data1.'--'.$data2); //输出1--4,就是$data1匹配次数为,$data2匹配次数为4
(2)preg_replace和preg_filter
匹配到相应的结果并且进行替换,两个函数非常相似,具体区别是什么继续往下看。
$data1 = preg_filter($pattern,$replace,$subject); //zhao你真棒hfhf你真棒shshsh你真棒shyune你真棒
$data2 = preg_replace($pattern,$replace,$subject); //zhao你真棒hfhf你真棒shshsh你真棒shyune你真棒
这时候看两个函数输出是一模一样 的,再继续往下看
$pattern = ['/[0-2]/','/[4-6]/'];
$subject = 'zhao9hfhf4shshsh0shyune8';
$replace = '你真棒啦';
$data1 = preg_filter($pattern,$replace,$subject);
$data2 = preg_replace($pattern,$replace,$subject);
var_dump($data1); //zhao9hfhf你真棒啦shshsh你真棒啦shyune8
var_dump($data2); //zhao9hfhf你真棒啦shshsh你真棒啦shyune8
这时候看起来也没什么不一样,再看一下
//意思就是把带有0-2的匹配出来替换成你,4-6的替换成真
$pattern = ['/[0-2]/','/[4-6]/'];
$subject = 'zhao9hfhf4shshsh0shyune8';
$replace = ['你','真'];
$data1 = preg_filter($pattern,$replace,$subject);
$data2 = preg_replace($pattern,$replace,$subject);
var_dump($data1); //zhao9hfhf真shshsh你shyune8
var_dump($data2); //zhao9hfhf真shshsh你shyune8
这时候两个函数也是一样的
$pattern = ['/[0-2]/','/[4-6]/'];
$subject = ['zhao9','hfhf4sh'];
$replace = ['你','真'];
$data1 = preg_filter($pattern,$replace,$subject);
$data2 = preg_replace($pattern,$replace,$subject);
var_dump($data1);
var_dump($data2);
下面是
d
a
t
a
1
和
data1和
data1和data2的输出结果
可以看懂清楚的对比,preg_filter只输出进行替换后的字符串,preg_replace输出替换后和没有替换的字符串
(3)preg_grep:只做匹配
$pattern = '/[0-2]/';
$subject = ['zh0ao9','hfhf1sh','hj8'];
$replace = ['你','真'];
$data1 = preg_grep($pattern,$subject);
var_dump($data1);
下面是输出值,找到并输出$subject中匹配的字符串
(4)preg_split
升级版explode函数,把一个字符串进行分割并且组成一个新的数组
$pattern = '/[0-2]/';
$subject = 'zh0ao9hfhf1shhj8';
$data1 = preg_split($pattern,$subject);
var_dump($data1);
遇见0分割,遇见了1分割
(5)preg_quote
把正则表达式中运算符进行转义
//平时不常用
$str = 'zhao12{6767}\86h';
$data1 = preg_quote($str);
var_dump($data1); //'zhao12\{6767\}\\86h'
- 正则表达式的语法
(1)界定符
本质也是字符串,可以使用/、{}、#
如:/[0-9]/,#[0-9]#,{[0-9]}
注意:大括号也是一个转义符为了产生歧义尽量少用
(2)工具:http://reg.1zdz.cn/
(3)原子
可见原子是指Unicode编码中用键盘输出后肉眼可见的字符。
包括:1、标点;2、英文字母数字;3、汉字,日文,阿拉伯文等其他语言文字;4、∑,∈,≌等数理化公式符号;5、其他可见字符。
由于编码格式不一样,汉字尽量使用unicode进行编码
不可见原子就是Unicode编码中用键盘输出后肉眼不可见的字符。
例如:1、换行符:\n;2、回车:\r;3、制表符:\t;4、空格;5、其他不可见的符号。
(4)元字符
下图是匹配
也可以写成下面这种新三形势
- 实战
(1)非空
.+
(2)浮点数匹配
保留两位小数的浮点数
(3)手机号匹配
1(3|4|5|7|8)\d{10}
(4)匹配邮箱
$mail = ‘runoob@runoob.com’; //邮箱地址
KaTeX parse error: Can't use function '\.' in math mode at position 26: …"/^[_a-z0-9-]+(\̲.̲[_a-z0-9-]+)*@[…/";
preg_match($pattern, $mail, m a t c h e s ) ; v a r d u m p ( matches); var_dump( matches);vardump(matches); //输出匹配结果