正则表达式:是用于描述字符排列模式的一种语法规则。
应用范围:
表单验证,数据替换,字符串的分割、匹配、查找及替换等。
PHP中有两种形式的正则表达式:
一种是由“POSIX”扩展库提供的,另一种是“PCRE”(Perl)库提供的。语法不同,但是功能完全一样。
PCRE库的正则表达式,这种形式更加强大,效率略占优势
所以的语言,都支持正则表达式
主要应用场景及相关函数
-
验证数据
相关函数:preg_match( z z , zz, zz,str);
-
字符匹配
ereg() //POSIX样式
preg_match(); //Perl样式
1.如果是匹配,返回1,也就是true,否则返回0,也就是false
2.preg_match()是ereg()的代替方案,preg_match()速度更快
-
-
替换数据
preg_replace(“正则表达式”,替换为,替换位置,替换次数)
列:echo preg_replace("/[2563]/","*", s t r ) / / 将 str) //将 str)//将str中的2563全部替换为*
-
正则分割函数
preg_split("/正则表达式/",分割字符串)
-
匹配数据
获得匹配规则的数据
preg_match_all("/zz/",)
正则表达式构成
-
原子(普通字符)
个人字符,数字
-
元字符(特殊字符)
正则表达式的规则写法
-
$zz="/正则表达式/"
z z = " / 正 则 表 达 式 zz="/^正则表达式 zz="/正则表达式/"
^或/A 字符串首匹配
$或/z 字符串尾匹配
手机号验证
- 思路:11位,全数字,1开头
$zz="/^1[0-9]{10}$/"
-
[]表示选取范围内的一个原子
{m}表示其前恰好出现m次
{m,n}表示其前原子至少出现m次,最多出现n次(n>m)
{m,}表示其前原子出现不少于m次
-
$phone=“电话号码”
验证过程
<?php $phone="12345678911"; $zz="/^1[0-9]{10}$/"; //提高严谨性 $a=preg_match($zz,$phone); var_dump($a); //int(1) ?>
邮箱验证
-
思路分析:邮箱由字母数字@.组成
1.一定包含@.
2.格式为:xxx@yy.zzz
xxx与yy都是数字与字母的组合
zzz对应邮箱平台方的域名后缀,一般为字母,至少两位,最多四位
-
\w:匹配一个英文字母、数字或下划线:等价于[0-9a-zA-Z]
-
\W:匹配除英文字母、数字或下划线以外任何一个字符,等价于[^0-9a-zA-Z]
-
+:匹配1次或多次匹配其前的原子
-
*:0次、1次或多次匹配其前的原子
-
?:0次或1次匹配其前的原子
-
.:匹配任何一个字符
<?php
$str="redbud@163.com";
$zz="/^\w+@\w+.\w{2,}$/";
$check=preg_match($zz,$str);
if($check){
echo "邮箱正确";
}
else{
echo "邮箱错误";}
?> //返回为邮箱正确
网址链接验证
-
验证网址链接必须有http://或者https://
<?php $str="https://www.redbud.com"; $zz="/^https?:\/\/\w+\.+/w+/"; $check="preg_match($zz,$str)"; if($check) echo "网站正确"; else echo "网站错误"; ?> //返回值为网站正确
- ():元子符"()"将其中的正则表达式变为原子(或模式单元)使用。
- |:表示为或者关系
-
验证网址链接
<?php $str="https://www.redbud.com"; $zz="/^(https)|(http)?:\/\/\w+\.+/w+/"; $check="preg_match($zz,$str)"; if($check) echo "网站正确"; else echo "网站错误"; ?> //返回值为网站正确
验证真实姓名必须为汉字
-
验证姓名必须为两个汉字以上
<?php $str="某某某"; $zz="/^[^u4E00-u9FA5]{4,10}/"; //固定写法,汉字为两个字节,至多五个汉字 $check=preg_match($zz,$str); if($check) echo "姓名正确"; else echo "姓名错误"; ?> //返回值为姓名正确
保密或隐藏客户手机号
- 网站中显示手机号,隐藏部分数字
<?php
$str=12536895581;
$zz=preg_replace("/[68]/","*",$str);
echo "$zz";
?> //返回值为1253**955*1
<?php
$str=12536895581;
$zz=preg_replace("/[68]/","*",$str,1);
echo "$zz";
?> //返回值为1253*6895581
字符串分割成数组
-
将字符串分割为需要的数组,代替explode不能完成的分割操作
<?php $str="张山#李四#王五,小李"; $arr=explode("#",$str); print_r($arr); ?> //输出为0=>张三 1=>李四 2=>王五,小李
<?php
$str="张山#李四#王五,小李";
$arr=preg_split("/[#,]/",$str);
print_r($arr);
?> //输出为0=>张三 1=>李四 2=>王五 3=>小李
匹配数据
-
数据采集流程上
1.获取信息,比如:用file_get_contents($url)
2.对有效数据信息进行截取处理preg_match_all
<?php $str="网路抓包数据"; $zz="正则表达式"; preg_match_all($zz,$str,$arr); print_r($arr); ?> //将zz中的数据通过str的正则表达式规则进行数据匹配,得到想要的数据,保存至$arr中