Linfinity

Never say never.
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

php--正则表达式

Posted on 2019-01-14 21:37  Linfinity  阅读(153)  评论(0)    收藏  举报

正则表达式介绍

正则表达式就是用来筛选字符串的由于字符串范围很广一个一个的比较效率很低使用正则表达式就可以先定义一套规则在使用这个规则进行匹配

 

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、正则表达式相关的函数

 (1preg_match

使用正则表达式(规则)对字符串进行筛选,筛选到一个结果即停止

2preg_match_all

使用正则表达式(规则)对字符串进行筛选,筛选到结果先保存到数组,并继续筛选,直到字符串结束

3preg_replace

使用正则表达式(规则)对字符串进行筛选,再将筛选的内容进行替换

4preg_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;
        }
    }
}
Verify.class.php