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

本文实例讲述了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]]);
 } 
  }
}

PS:这里再为大家提供2款非常方便的正则表达式工具供大家参考使用:

JavaScript正则表达式在线测试工具:
http://tools.freexyz.cn/regex/javascript

正则表达式在线生成工具:
http://tools.freexyz.cn/regex/create_reg

更多关于PHP相关内容感兴趣的读者可查看本站专题:《php程序设计安全教程》、《php安全过滤技巧总结》、《PHP基本语法入门教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容