php实现的表单验证类完整示例


Posted in PHP onAugust 13, 2019

本文实例讲述了php实现的表单验证类。分享给大家供大家参考,具体如下:

<?php
/**
 * 用法
 * use Validate\Validator;
 * 
 * $rules = [ 
 *    ['name|名字', 'require|email|in:7,8,9|max:10|min:6|between:6,8|length:2', '名字不能为空|名字必须必须为正确的邮件地址'],
 *    ['test|测试', 'require'],
 *  ];
 * $data = ['name' => '8gAg:'];
 * $validator = new Validator($rules);
 * $validator->addRule(['name|名字', 'regex', '/^[0-8|a-z]+$/', '正则验证失败哦']); //可以为二维数组,有|的正则验证只能通过addRule。
 * $validator->validate($data);
 * $validator->getAllErrors(); //获取所有验证错误 array
 * $validator->getError(); //获取第一条验证错误 string
 * Validator::in('7,8,9', 8); //静态调用
 * Validator::isEmail('375373223@qq.com');
 */
namespace Validate;
class Validator {
  //错误信息
  private $error = [];
  //传入的验证规则
  private $validate = [];
  //需要验证的参数
  private $data = [];
  //添加的规则
  private $add_rules = [];
  //默认错误提示
  private $error_msg = [
    'require' => ':attribute不能为空',
    'number' => ':attribute必须为数字',
    'array'  => ':attribute必须为数组',
    'float'  => ':attribute必须为浮点数',
    'boolean' => ':attribute必须为布尔值',
    'email'  => ':attribute必须为正确的邮件地址',
    'url'   => ':attribute必须为正确的url格式',
    'ip'   => ':attribute必须为正确的ip地址',
    'timestamp' => ':attribute必须为正确的时间戳格式',
    'date'  => ':attribute必须为正确的日期格式',
    'regex'  => ':attribute格式不正确',
    'in'   => ':attribute必须在:range内',
    'notIn'  => ':attribute必须不在:range内',
    'between' => ':attribute必须在:1-:2范围内',
    'notBetween' => ':attribute必须不在:1-:2范围内',
    'max'   => ':attribute最大值为:1',
    'min'   => ':attribute最小值为:1',
    'length' => ':attribute长度必须为:1',
    'confirm' => ':attribute和:1不一致',
    'gt'   => ':attribute必须大于:1',
    'lt'   => ':attribute必须小于:1',
    'egt'   => ':attribute必须大于等于:1',
    'elt'   => ':attribute必须小于等于:1',
    'eq'   => ':attribute必须等于:1',
  ];
  public function __construct($validate = null) {
    $this->validate = $validate;
 }
  /**
   * [validate 验证]
   * @param [type] $data [需要验证的参数]
   * @return [type]    [boolean]
   */
 public function validate($data) {
 $this->data = $data;
    foreach ($this->validate as $key => $item) {
     $item_len = count($item);
     $name = $item[0];
     $rules = $item[1];
     $rules = explode('|', $rules);
     $message = $item_len > 2 ? explode('|', $item[2]) : null;
      $this->check($name, $rules, $message); 
    }
    if(!empty($this->add_rules)) {
     $this->checkAddRules();
    }
    return empty($this->error) ? TRUE : FALSE;
 }
  /**
   * [check 单个字段验证]
   * @param [type] $name  [description]
   * @param [type] $rules  [description]
   * @param [type] $message [description]
   * @return [type]     [null]
   */
 private function check($name, $rules, $message) {
 //$title = $name;
 $rule_name = $title = $name;
 if(strpos($name, '|')) {
  $rule_name = explode('|', $name)[0];
  $title = explode('|', $name)[1];
 }
    foreach ($rules as $i => $rule) {
   $validate_data = isset($this->data[$rule_name]) ? $this->data[$rule_name] : null;
     
     $result = $this->checkResult($rule, $validate_data);
     if(!$result) {
     $error_info = isset($message[$i]) ? $message[$i] : $this->getMessage($title, $rule);
        if($error_info) {
         array_push($this->error, $error_info);
        }
     }
    }
 }
  /**
   * [getMessage 获取验证失败的信息]
   * @param [type] $name [字段名]
   * @param [type] $rule [验证规则]
   * @return [type]    [string OR fail false]
   */
 private function getMessage($name, $rule) {
 $value1 = '';
 $value2 = '';
 $range = '';
 $error_key = $rule;
    if(strpos($rule, ':')) {
     $exp_arr = explode(':', $rule);
     $error_key = $exp_arr[0];
     $range = $exp_arr[1];
     $message_value = explode(',', $exp_arr[1]);
     $value1 = isset($message_value[0]) ? $message_value[0] : '';
     $value2 = isset($message_value[1]) ? $message_value[1] : '';
    }
    if(isset($this->error_msg[$error_key])) {
     return str_replace([':attribute', ':range', ':1', ':2'], [$name, $range, $value1, $value2], $this->error_msg[$error_key]);
    }
 return false;
 }
  /**
   * [checkResult 字段验证]
   * @param [type] $rule     [验证规则]
   * @param [type] $validate_data [需要验证的数据]
   * @return [type]        [boolean]
   */
 private function checkResult($rule, $validate_data) {
    switch ($rule) {
     case 'require':
       return $validate_data != '';
     break;
     case 'number':
       return filter_var($validate_data, FILTER_SANITIZE_NUMBER_INT);
     break;
     case 'array':
       return is_array($validate_data);
     break;
     case 'float':
       return filter_var($validate_data, FILTER_VALIDATE_FLOAT);
     break;
     case 'boolean':
       return filter_var($validate_data, FILTER_VALIDATE_BOOLEAN);
     break;
     case 'email':
       return filter_var($validate_data, FILTER_VALIDATE_EMAIL);
     break;
     case 'url':
       return filter_var($validate_data, FILTER_SANITIZE_URL);
     case 'ip':
       return filter_var($validate_data, FILTER_VALIDATE_IP);
     break;
     case 'timestamp':
       return strtotime(date('Y-m-d H:i:s',$validate_data)) == $validate_data;
     break;
     case 'date': //2017-11-17 12:12:12
       return strtotime($validate_data);
     break;
     default:
         if(strpos($rule, ':')) {
         $rule_arr = explode(':', $rule);
         $func_name = substr($rule, strpos($rule, ':')+1);
         return call_user_func_array([$this, $rule_arr[0]], [$func_name, $validate_data]); 
       }else{
        return call_user_func_array([$this, $rule], [$rule, $validate_data]); 
       }
     break;
    }
 }
  /**
   * [regex 正则验证]
   * @param [type] $rule [description]
   * @param [type] $data [description]
   * @return [type]    [description]
   */
 public static function regex($rule, $data) {
    return filter_var($data, FILTER_VALIDATE_REGEXP, ["options" => ["regexp" => $rule]]);
 }
  /**
   * [addRule 添加规则格式 []]
   * @param [type] $rule [description]
   */
 public function addRule($rule) {
 if(is_array(current($rule))) {
  $this->add_rules = array_merge($this->add_rules, $rule);
 }else{
  array_push($this->add_rules, $rule);
 }
 }
  /**
   * [checkAddRules 添加新的规则的验证]
   * @return [type] [description]
   */
 public function checkAddRules() {
 foreach ($this->add_rules as $key => $item) {
  $name = $item[0];
     $message = isset($item[3]) ? $item[3] : null;
     $rule_name = $title = $name;
  if(strpos($name, '|')) {
  $rule_name = explode('|', $name)[0];
  $title = explode('|', $name)[1];
  }
  $validate_data = isset($this->data[$rule_name]) ? $this->data[$rule_name] : null;
     
      $result = $this->checkResult($item[1].':'.$item[2], $validate_data);
     if(!$result) {
     $error_info = isset($message) ? $message : $this->getMessage($title, $item[1]);
       if($error_info) {
         array_push($this->error, $error_info);
       }
     } 
 }
 }
 /**
 * [in description]
 * @param [type] $rule [验证规则]
 * @param [type] $data [需要验证的数据]
 * @return [type]    [boolean]
 */
 public static function in($rule, $data) {
 if(!is_array($rule)) {
  $rule = explode(',', $rule);
 }
    return in_array($data, $rule);
 }
  /**
 * [in description]
 * @param [type] $rule [验证规则]
 * @param [type] $data [需要验证的数据]
 * @return [type]    [boolean]
 */
 public static function notIn($rule, $data) {
    return !$this->in($data, $rule);
 }
  /**
 * [in description]
 * @param [type] $rule [验证规则]
 * @param [type] $data [需要验证的数据]
 * @return [type]    [boolean]
 */
 public static function between($rule, $data) {
 $rule = explode(',', $rule);
    return $data >= $rule[0] && $data <= $rule[1];
 }
  /**
 * [in description]
 * @param [type] $rule [验证规则]
 * @param [type] $data [需要验证的数据]
 * @return [type]    [boolean]
 */
 public static function notBetween($rule, $data) {
 return !$this->between($rule, $data);
 }
  /**
 * [in description]
 * @param [type] $rule [验证规则]
 * @param [type] $data [需要验证的数据]
 * @return [type]    [boolean]
 */
 public static function max($rule, $data) {
 return $data <= $rule;
 }
  /**
 * [in description]
 * @param [type] $rule [验证规则]
 * @param [type] $data [需要验证的数据]
 * @return [type]    [boolean]
 */
 public static function min($rule, $data) {
 return $data >= $rule;
 }
  /**
 * [in description]
 * @param [type] $rule [验证规则]
 * @param [type] $data [需要验证的数据]
 * @return [type]    [boolean]
 */
 public static function length($rule, $data) {
 $length = is_array($data) ? count($data) : strlen($data);
 return $length == $rule;
 }
  /**
 * [in description]
 * @param [type] $rule [验证规则]
 * @param [type] $data [需要验证的数据]
 * @return [type]    [boolean]
 */
 public static function confirm($rule, $data) {
 return isset($this->data[$rule]) && $data == $this->data[$rule];
 }
 public static function gt($rule, $data) {
 return $data > $rule;
 }
  public static function lt($rule, $data) {
 return $data < $rule;
 }
 public static function egt($rule, $data) {
 return $data >= $rule;
 }
  public static function elt($rule, $data) {
 return $data <= $rule;
 }
 public static function eq($rule, $data) {
 return $data == $rule;
 }
  /**
 * [in 获取验证失败的第一条信息]
 * @return [type] [string]
 */
 public function getError() {
    return count($this->error) > 0 ? $this->error[0] : null;
 }
  /**
   * [getAllErrors 获取所有验证失败的信息]
   * @return [type] [array]
   */
 public function getAllErrors() {
    return $this->error;
 }
  /**
   * [__call 调用自定义函数或者]
   * @param [type] $func [验证规则,函数名]
   * @param [type] $data [验证数据]
   * @return [type]    [boollean]
   */
 function __call($func, $data) {
 $func_arr = get_defined_functions();
 if(in_array($func,$func_arr['user'])) {
  return call_user_func($func, $data);
 }else{
  array_push($this->error, '没有' . $func . '这个方法');
 }
  }
  /**
   * [__callStatic 静态方法调用自定义函数或者]
   * @param [type] $func [验证规则,函数名]
   * @param [type] $data [验证数据]
   * @return [type]    [boollean]
   */
  public static function __callStatic($func, $data) {
  if(substr($func, 0, 2) == 'is') {
  return call_user_func_array([new self, 'checkResult'], [strtolower(substr($func, 2)), $data[0]]);
 } 
  }
}
PHP 相关文章推荐
如何利用php+mysql保存和输出文件
Oct 09 PHP
自己前几天写的无限分类类
Feb 14 PHP
PHP 日常开发小技巧
Sep 23 PHP
php环境无法上传文件的解决方法
Apr 30 PHP
Laravel框架数据库CURD操作、连贯操作总结
Sep 03 PHP
PHP实现指定字段的多维数组排序函数分享
Mar 09 PHP
Yii框架实现邮箱激活的方法【数字签名】
Oct 18 PHP
PHP实现上传图片到 zimg 服务器
Oct 19 PHP
php中10个不同等级压缩优化图片操作示例
Nov 14 PHP
PHP自定义函数实现assign()数组分配到模板及extract()变量分配到模板功能示例
May 23 PHP
浅谈laravel-admin form中的数据,在提交后,保存前,获取并进行编辑
Oct 21 PHP
Thinkphp5框架异常处理操作实例分析
Jun 03 PHP
thinkphp3.2同时连接两个数据库的简单方法
Aug 13 #PHP
php实现简单的守护进程创建、开启与关闭操作
Aug 13 #PHP
Laravel如何同时连接多个数据库详解
Aug 13 #PHP
Laravel 默认邮箱登录改成用户名登录的实现方法
Aug 12 #PHP
php链式操作的实现方式分析
Aug 12 #PHP
基于PHP实现微信小程序客服消息功能
Aug 12 #PHP
php swoole多进程/多线程用法示例【基于php7nts版】
Aug 12 #PHP
You might like
新手配置 PHP 调试环境(IIS+PHP+MYSQL)
2007/01/10 PHP
php实现数组筛选奇数和偶数示例
2014/04/11 PHP
PHP学习笔记(二) 了解PHP的基本语法以及目录结构
2014/08/04 PHP
php基于协程实现异步的方法分析
2019/07/17 PHP
JavaScript RegExp方法获取地址栏参数(面向对象)
2009/03/10 Javascript
对xmlHttp对象方法和属性的理解
2011/01/17 Javascript
js jquery验证银行卡号信息正则学习
2013/01/21 Javascript
js仿百度有啊通栏展示效果实现代码
2013/05/28 Javascript
禁用页面部分JavaScript方法的具体实现
2013/07/31 Javascript
JavaScript动态操作表格实例(添加,删除行,列及单元格)
2013/11/25 Javascript
Nodejs实战心得之eventproxy模块控制并发
2015/10/27 NodeJs
浅析JavaScript回调函数应用
2016/05/22 Javascript
深入理解Angular2 模板语法
2016/08/07 Javascript
AngularJS自定义控件实例详解
2016/12/13 Javascript
DOM事件探秘篇
2017/02/15 Javascript
解决AjaxFileupload 上传时会出现连接重置的问题
2017/07/07 Javascript
Array数组对象中的forEach、map、filter及reduce详析
2018/08/02 Javascript
JS实现4位随机验证码
2020/10/19 Javascript
web.py 十分钟创建简易博客实现代码
2016/04/22 Python
浅析python中的分片与截断序列
2016/08/09 Python
Python cookbook(数据结构与算法)根据字段将记录分组操作示例
2018/03/19 Python
Python简单实现的代理服务器端口映射功能示例
2018/04/08 Python
Flask框架各种常见装饰器示例
2018/07/17 Python
python导入坐标点的具体操作
2019/05/10 Python
python通过http下载文件的方法详解
2019/07/26 Python
Python根据字符串调用函数过程解析
2020/11/05 Python
在python3.9下如何安装scrapy的方法
2021/02/03 Python
美国男士西装打折店:Jos. A. Bank
2017/11/13 全球购物
应聘自荐书
2013/10/08 职场文书
求职自荐书范文
2013/12/04 职场文书
社区巾帼文明岗事迹材料
2014/06/03 职场文书
教师考察材料范文
2014/06/03 职场文书
Django使用channels + websocket打造在线聊天室
2021/05/20 Python
Java 超详细讲解hashCode方法
2022/04/07 Java/Android
Python中time标准库的使用教程
2022/04/13 Python
CentOS7环境下MySQL8常用命令小结
2022/06/10 Servers