php验证器类

PHP 2019年03月21日 18:57 Norsl 121 3

用过thinkphp的朋友可能一下就感觉出来了,有点像tp里面的验证器类,确实,我就是用过后做的一个仿品,大致功能都实现出来了。


<?php
/**
 * Created by PhpStorm.
 * User: Administrator1
 * Date: 2019/3/21
 * Time: 13:54
 */

namespace lib;

/**
 * Class Validate
 * 数据验证类
 * 1、实例化时传递验证规则数组,多个验证规则用|隔开,可自定义验证规则,添加对应方法即可。例:
 * $validate = new Validate([
 *      'user'       =>  'required',
 *      'pass'       =>  'required|minLength:6|maxLength:32',
 *      'pass2'      =>  'required|confirm:pass'
 * ]);
 *
 * 2、最后通过对象的check()方法,把需要验证的数据传进去,验证失败则返回false,可通过对象的getError()方法获取错误信息。例:
 * $data = [
 *      'user'      =>  'norsl',
 *      'pass'      =>  '123456',
 *      'pass2'     =>  '123456'
 * ];
 * if($validate->check()){
 *      // 验证成功
 * }else{
 *      // 验证失败
 *      echo $validate->getError();
 * }
 *
 * 3、可自定义错误信息,实例化对象时传递第二个参数就行,也可以在类里定义message字段。例:
 * $validate = new Validate([
 *      'user'       =>  'required',
 *      'pass'       =>  'required|minLength:6|maxLength:32',
 *      'pass2'      =>  'required|confirm:pass'
 * ],[
 *      'user.required'     =>      '用户名必填',
 *      'pass2.confirm'     =>      '两次输入密码不一致'
 * ]);
 */
class Validate{
    private $errorMsg = null;
    private $data;
    protected $rule;
    protected $message;

    public function __construct($rule = [], $message = []){
        $this->rule     = $rule;
        $this->message  = $message;
    }

    /**
     * 数据验证
     */
    public function check($data){
        $this->errorMsg = null;
        $this->data = $data;
        // 循环字段验证规则
        foreach ($this->rule as $rKey => $rValue){
            $arrayHandler = explode('|', $rValue);

            // 如果有验证规则,而没有数据
            if(!isset($data[$rKey])){
                // 判断是否有required规则,有就验证失败,字段必填。没有就继续执行验证。
                foreach($arrayHandler as $h){
                    if($h == 'required'){
                        $this->errorMsg = isset($this->message[$rKey.'.required'])?$this->message[$rKey.'.required']:$rKey . '不能为空!';
                        return false;
                    }
                }
            }

            // 循环需要验证的数据
            foreach ($data as $dKey => $dValue){
                // 如果数据的key和验证规则的key相同就开始验证
                if($dKey == $rKey){
                    // 循环执行规则检测数据
                    foreach($arrayHandler as $handler){
                        // 判断是否有参数的验证器
                        if(strstr($handler, ':')){
                            // 0为函数名,1为参数
                            $array = explode(':', $handler);
                            $this->$array[0]($dKey, $dValue, $array[1]);
                        }else{
                            $this->$handler($dKey, $dValue);
                        }
                    }

                    // 如果有规则错误信息就验证失败
                    if($this->errorMsg){
                        return false;
                    }
                }
            }
        }
        return true;
    }

    /**
     * 返回错误信息
     */
    public function getError(){
        return $this->errorMsg;
    }

    /**
     * 验证必填项
     */
    protected function required($key, $value){
        if(empty($value) || $value == '' || $value == null){
            $this->errorMsg = isset($this->message[$key.'.'.__FUNCTION__])?$this->message[$key.'.'.__FUNCTION__]:$key . '不能为空!';
        }
    }

    /**
     * 验证是否为数字
     */
    protected function number($key, $value){
        if(!is_numeric($value)){
            $this->errorMsg = isset($this->message[$key.'.'.__FUNCTION__])?$this->message[$key.'.'.__FUNCTION__]:$key . '必须为数字!';
        }
    }

    /**
     * 验证字段一致性
     */
    protected function confirm($key, $value, $field){
        if($this->data[$field] != $value){
            $this->errorMsg = isset($this->message[$key.'.'.__FUNCTION__])?$this->message[$key.'.'.__FUNCTION__]:$key . '与' . $field . '的值不一致!';
        }
    }

    /**
     * 验证字段最小长度
     */
    protected function minLength($key, $value, $num){
        if(strlen($value) < $num){
            $this->errorMsg = isset($this->message[$key.'.'.__FUNCTION__])?$this->message[$key.'.'.__FUNCTION__]:$key . '长度不能小于' . $num;
        }
    }

    /**
     * 验证字段最大长度
     */
    protected function maxLength($key, $value, $num){
        if(strlen($value) > $num){
            $this->errorMsg = isset($this->message[$key.'.'.__FUNCTION__])?$this->message[$key.'.'.__FUNCTION__]:$key . '长度不能大于' . $num;
        }
    }

    /**
     * 验证小写字符串
     */
    protected function lower($key, $value){
        if(strtolower($value) != $value){
            $this->errorMsg = isset($this->message[$key.'.'.__FUNCTION__])?$this->message[$key.'.'.__FUNCTION__]:$key . '必须为小写!';
        }
    }

    /**
     * 验证大写字符串
     */
    protected function upper($key, $value){
        if(strtoupper($value) != $value){
            $this->errorMsg = isset($this->message[$key.'.'.__FUNCTION__])?$this->message[$key.'.'.__FUNCTION__]:$key . '必须为大写!';
        }
    }

    /**
     * 验证邮箱
     */
    protected function email($key, $value){
        $pattern = "/^([\w]{1,})@([a-zA-Z0-9]+[a-zA-Z0-9-]+[a-zA-Z0-9]+)\.([a-z]{2,5})$/";
        if(!preg_match($pattern, $value)){
            $this->errorMsg = isset($this->message[$key.'.'.__FUNCTION__])?$this->message[$key.'.'.__FUNCTION__]:$key . '不是有效的email地址!';
        }
    }

    /**
     * 验证url
     */
    protected function url($key, $value){
        $pattern = "/^(http|https):\/\/([a-zA-Z0-9]+)\.([a-zA-Z]{2,5})(.*)$/";
        if(!preg_match($pattern, $value)){
            $this->errorMsg = isset($this->message[$key.'.'.__FUNCTION__])?$this->message[$key.'.'.__FUNCTION__]:$key . '不是有效的url!';
        }
    }

    /**
     * 验证数字/字母字符串
     */
    protected function leterNum($key, $value){
        $pattern = "/^([a-zA-Z0-9]+)$/";
        if(!preg_match($pattern, $value)){
            $this->errorMsg = isset($this->message[$key.'.'.__FUNCTION__])?$this->message[$key.'.'.__FUNCTION__]:$key . '不是有效的数字/字母字符串!';
        }
    }
}


说点什么吗?

你的电子邮箱地址不会被公开。必填项已用 * 著名

*
*
验证码
  • 热血学霸 2019年04月19日 15:46

    感谢大佬分享,好人一生平安
  • zgcwkj 2019年03月30日 08:20

    给力啊!!!谢了
  • 妙文屋 2019年03月29日 15:36

    写的很好,很喜欢

Norsl の 个人名片

职业:web开发

现居:四川 成都

Git:https://gitee.com/norsl

邮箱:3136904131@qq.com

最新评论

  • Norsl : 当时都以为凉凉了,不然现在就是空库了
  • LILI : 有惊无险啊哈
  • 林三 : 原谅我每次过来都找不到地方说话,你哪些代码函数太深奥,我确实看不懂呢。
  • 热血学霸 : 感谢大佬分享,好人一生平安
  • 格瑞LILI : 你猜我是从哪看到你的博客的《-_-》
  • 格瑞LILI : 网站名称:格瑞LILI 网站地址:https://kaygb.top 网站描述:个人博客,分享学习生涯遇到的问题
  • zgcwkj : 给力啊!!!谢了
  • 妙文屋 : 写的很好,很喜欢
  • 马也随笔 : 这个记录评论者COOKIE功能挺实用的,有没有插件可以使用的,用的WP。
  • 林三 : 你厉害,我是追不上了,业务的太狠了。