正则表达式介绍
正则表达式就是用来筛选字符串的,由于字符串范围很广,一个一个的比较,效率很低,使用正则表达式就可以先定义一套规则,在使用这个规则进行匹配
1、正则表达式语法
(1) 定界符
表示规则的边界,从哪里开始到哪里结束

(2) 元字符
元字符就表示筛选的内容(一个字符)
常见元字符





(3) 量词
说明:默认情况下,正则表达式采用的是贪婪模式(尽可能多的匹配)
量词表示元字符的数量,也就是筛选的内容的长度
^ $ 表示从开始到结束
{m},固定数量m个
{n,m},表示最少n个,最多m个
{n,} ,表示最少n个,最多无穷个
*,表示0个或多个
+,表示至少1个
?,表示0个或1个
? 的特殊使用
? 如果放在元字符后面,表示0个或1个,但是如果放在量词的后面表示将贪婪模式修改为懒惰模式(尽可能少的匹配)
(4)模式修正符
描述:
模式修正符,用来对前面的正则表达式进行修饰作用。 用在//后面,如"//i"
1->i忽略大小写
2->s,表示万能点模式,能匹配到回车。
3->u,表示采用utf8编码进行处理,用于匹配中文。
表示任何中文。
4->U,表示将贪婪模式修改懒惰模式
默认是贪婪模式,就会尽可能多的去匹配
5->m,多行模式(了解即可)
一个字符串,即使出现换行,仍然表示一个字符串整体,使用m将单行模式修改为多行模式,每个回车换行当做是一个新的字符串。
2、正则表达式细节
(1)分组的使用
使用正则表达式进行匹配的时候,可以使用()将需要的内容括起来,每个小括号的内容就会当做一个小组,并保存到数组中。
第一个()的内容会保存到数组下标为1的元素中
第二个()的内容会保存到数组下标为2个元素中
以此类推
(2)反向引用
说明:反向引用就是反过来使用前面分组的内容(对前面分组的内容的引用)
使用反向引用进行匹配:\1 引用前面第一个()匹配的结果,\2引用前面第二个()匹配的结果
如在 reg="(\w)\1" \1代表\w

(3)非捕获子组
说明:不捕获分组的结果(没什么用处)

(4)正向预查
说明:从左向右预查,提前查询(注意(?=)里的内容仅作为条件不会匹配到)。

(5)逆向预查
说明:从右向左预查

3、正则表达式相关的函数
(1)preg_match
使用正则表达式(规则)对字符串进行筛选,筛选到一个结果即停止
(2)preg_match_all
使用正则表达式(规则)对字符串进行筛选,筛选到结果先保存到数组,并继续筛选,直到字符串结束
(3)preg_replace
使用正则表达式(规则)对字符串进行筛选,再将筛选的内容进行替换
(4)preg_split
使用正则表达式(规则)对字符串进行拆分
explode()是根据某个字符进行分割

4、用户验证封装类
<?php /* * 验证类:主要负责用户名、密码、邮箱、手机号码等规则的验证 */ class Verify { private $error = array(); //获得错误信息 public function showError() { $err_str = ''; foreach ($this->error as $v){ $err_str .= $v.'<br>'; } return $err_str; } //验证用户名是否符合规则 //参数1:$username待验证的用户名 //参数2:$min 最少多少位 //参数3:$max 最多多少位 public function checkUser($username,$min=6,$max=30) { //1. 用户名的验证规则:6-30位,字母、数字、下划线组合,字母开头 $min = $min-1; $max = $max-1; $reg = '/^[a-zA-Z]\w{'.$min.','.$max.'}$/'; preg_match($reg, $username,$result); if($result){ return true; }else{ $this->error[] = '6-30位,字母、数字、下划线组合,字母开头'; return false; } } //验证手机号码是否符合规则 //参数1:待验证的手机号码 public function checkPhone($phone) { //1. 定义手机号码的规则 $reg = '/^1[34578]\d{9}$/'; preg_match($reg, $phone,$result); if($result){ return true; }else{ $this->error[] = '请输入正确的手机号码'; return false; } } //验证密码是否符合规则 //参数1:$password待验证的密码 //参数2:$min 最少多少位 //参数3:$max 最多多少位 public function checkPass($password,$min=6,$max=20) { //1. 先定义一个纯字母、纯数字的规则 $reg1 = '/^[a-zA-Z]{'.$min.','.$max.'}$/'; //纯字母 $reg2 = '/^\d{'.$min.','.$max.'}$/'; //纯数字 $reg3 = '/^[a-zA-Z0-9]{'.$min.','.$max.'}$/'; //字母、数字的组合 $reg4 = '/^[a-zA-Z0-9~`!@#\$%\^&\*\(\)\-_\+=\{\}\[\]\|\\;:\'\"<>,\.\?\/]{'.$min.','.$max.'}$/'; //获得用户输入的密码 preg_match($reg1, $password,$result1); preg_match($reg2, $password,$result2); preg_match($reg3, $password,$result3); preg_match($reg4, $password,$result4); if($result1 || $result2){ //说明是纯字母或纯数字的 $this->error[] = '密码安全性低'; return true; }elseif ($result3){ //说明是字母、数字的组合 $this->error[] = '密码安全性中'; return true; }elseif($result4){ //说明是特殊符号、字母、数字的组合 $this->error[] = '密码安全性强'; return true; }else{ $this->error[] = '密码不符合规则'; return false; } } //验证邮箱是否符合规则 //参数1:$email,待验证的邮箱 public function checkEmail($email) { //@后面可能有vip. 也可能没有 $reg = '/^[\w\-\.]+@([a-zA-Z\d]+\.)?[a-zA-Z\d]+\.[A-Za-z]{2,4}$/'; //3. 使用我们规则检验一下用户的输入是否符合规则 preg_match($reg, $email,$result); if($result){ //验证通过 return true; }else{ //邮箱不合法 $this->error[] = '邮箱不合法'; return false; } } }
浙公网安备 33010602011771号