《PHP之正则表达式实战及正则工具类封装》

本文介绍正则表达式的实际应用案例,包括非空检查、浮点数匹配、手机号验证、Email地址验证及URL地址匹配等,并提供PHP工具类用于简化验证流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、正则表达式实例
(1)非空
非空转换成正则表达式的口头语言就是 原子出现的次数为一次到无穷大次(无论是可见原子还是不可见原子),那么它的正则表达式就应该这么写 $pattern = ‘/.+/’(.表示匹配除换行符以外的所有字符,+表示一个量词,它表示前边的原子连续出现一次到无穷大次),当然这种写法不是唯一,大家也可以自己想出一些,然后使用我上一篇博客中提到的工具测试一下(http://blog.youkuaiyun.com/self_realian/article/details/78568368)
(2)浮点数匹配(以保留两位的浮点数为例)
转换成口头语言就是:首先肯定是一个数字,这个数字可能3位,也可能n位,也就是数字连续出现1次到无穷次,后边跟一个小数点,最后再跟上两个数字 $pattern=’/\d+\.\d{2}$/’; 这个表达式很简单就不解释了,看完上一篇博客,这个很好理解的(强调一下后边那个$符,就是强制要求小数点后边必须两位)(http://blog.youkuaiyun.com/self_realian/article/details/78568368)
(3)手机号匹配
转换成口头语言就是:首先是一个十一位的数字,然后第一位是1,第二位一般也就是3,4,5,7,8

$pattern = ‘/1(3|4|5|7|8)\d{9}/’;

(4)Email地址匹配
转换成口头语言就是:首先在@符的前边可能是字母、数字、下划线,而出现的次数可能是一次到无穷大次
$pattern = ‘/^\w+(\.\w+)*@\w+(\.\w+)+$/’; 需要解释的地方就是(.\w+)* 部分,因为有的邮箱可能在@符的前边也有.,而且可能不止一个,所以写了这部分表达式
(5)URL地址匹配
这个我直接就写了,大家看我的截图就行

$pattern = ‘/^(https?:\/\/)?(\w\.)+[a-zA-Z]+$/’

这里写图片描述
这里写图片描述
这里写图片描述
总结:正则表达式有很大的灵活性,这些写法都不是唯一的,大家可以尝试着用别的方法去写
二、正则工具类
regexTool.class.php

<?php

class regexTool {
    private $validate = array(
        'notnull'     => '/^.+$/',
        'float'       => '/^\d+\.\d{2}$/',
        'phonenumber' => '/^1(3|4|5|7|8)\d{9}$/',
        'email'       => '/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/',
        'url'         => '/^(https?:\/\/)?(\w\.)+[a-zA-Z]+$/',
        'qq'          => '/^\d{5,11}$/',
    );//这个私有成员存放一些常用的正则表达式
    private $returnMatchResult = false;//定义它返回的结果,到底是匹配到的次数还是匹配结果
    //当这个成员属性为false时,我们只返回验证的结果为真还是假,如果为true,则返回的是匹配到的结果的数组
    private $fixMode = null;//这个用来存放修正模式(贪婪模式、懒惰模式)
    private $matches = array();//匹配到的结果数组
    private $isMatch = false;//验证的结果(验证成功返回true,失败返回false)

    public function __construct($returnMatchResult = false, $fixMode = null){//第一个参数,定义返回结果的类型,第二个参数为修正模式
        $this->returnMatchResult = $returnMatchResult;
        $this->fixMode = $fixMode;
    }

//定义一个私有的核心匹配方法
    private function regex($pattern, $subject){//$pattern 正则表达式  $subject匹配的目标数据
        //当这个$pattern在我们类中定义的那些常用的正则表达式时,我们就不用再重新写正则表达式了,直接去获取。如果没有,我们就可以通过自定义的方式来书写
        if(array_key_exists(strtolower($pattern), $this->validate)){//查看数组中是否存在某一个键
            $pattern = $this->validate[$pattern].$this->fixMode;
        }
        //判断我们是要匹配到的结果数组,还是是否匹配到
        $this->returnMatchResult ? preg_match_all($pattern, $subject, $this->matches) : 
        $this->isMatch = preg_match($pattern, $subject) === 1;

        return $this->getRegexResult();//因为这个返回值的类型我们不确定,所以我们单独写了一个函数
    }

    private function getRegexResult(){
        if($this->returnMatchResult){
            return $this->matches;//如果为真,返回的是匹配结果的数组
        }else{
            return $this->isMatch;
        }
    }

//当对象实例化完成之后,可能中途中我们会有切换返回类型的需求,比如说,一开始我们想返回匹配的结果,那么经过一些逻辑操作之后,我们可能想让它返回一个验证的结果,那么就需要写一个方法,让它可以切换返回的类型
    public function toggleReturnType($bool = null){
        if(empty($bool)){
            $this->returnMatchResult = !$this->returnMatchResult;
        }else{
            $this->returnMatchResult = is_bool($bool) ? $bool : (bool)$bool;
        }
    }
//下边定义一些修改私有成员属性的一些方法
    //修改修正模式
    public function setFixMode($fixMode){
        $this->fixMode = $fixMode;
    }
//定义一些在函数外部,调用的数据验证的方法
    //1,非空验证
    public function noEmpty($str){
        return $this->regex('notnull',$str);//验证非空的正则表达式在我们定义的常用正则表达式中有,所以我们直接传入key值
    }
    //2,验证Email是否正确的方法
    public function isEmail($email){
        return $this->regex('email',$email);
    }
    //3,手机号的验证
    public function isMobile($mobile){
        return $this->regex('phonenumber',$mobile);
    }
    //别的验证就不一一写了

//用户自定义的正则表达式的验证
    public function check($pattern, $subject){
        return $this->regex($pattern, $subject);
    }
}

test.php

require_once 'regexTool.class.php';

$regex = new regexTool();
$e = $regex->setFixMode('U');
//验证邮箱
$result = $regex->isMobile('13213795555');
show($result);

function show($var = null, $isdump = false) {
    $func = $isdump ? 'var_dump' : 'print_r';
    if(empty($var)) {
        echo 'null';
    } elseif(is_array($var) || is_object($var)) {
        //array,object
        echo '<pre>';
        $func($var);
        echo '</pre>';
    } else {
        //string,int,float...
        $func($var);
    }
}

邮箱验证:
这里写图片描述
这里写图片描述
手机号验证:
这里写图片描述
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值