php可扩展的验证类实例(可对邮件、手机号、URL等验证)


Posted in PHP onJuly 09, 2015

本文实例讲述了php可扩展的验证类。分享给大家供大家参考。具体分析如下:

这里介绍一个可扩展的php验证类,
类里面可以的各类验证可自行调整实现,现在为基本实现方式。
需要添加规则的话, 直接定义方法,方法名即为规则名称。具体参考使用方法。

require_once('./Validator.class.php');
$data = array(
  'nickname' => 'heno' ,
  'realname' => 'steven',
  'age' => 25,
  'mobile' => '1521060426');
$validator = new Validator($data);
$validator->setRule('nickname', 'required');
$validator->setRule('realname', array('length' => array(1,6), 'required'));
$validator->setRule('age', array('required', 'digit'));
$validator->setRule('mobile', array('mobile'));
$result = $validator->validate();
var_dump($result);
var_dump($validator->getResultInfo());

Validator.class.php文件如下:

<?php
/**
 * Validator 数据验证类
 * @package library
 * @category library
 * @author Steven
 * @version 1.0
 */
/**
 * Validator 数据验证类
 * @package library
 * @category library
 * @author Steven
 * @version 1.0
 */
class Validator {
 /**
  * 待校验数据
  * @var array
  */
 private $_data;
 /**
  * 校验规则
  * @var array
  */
 private $_ruleList = null;
 /**
  * 校验结果
  * @var bool
  */
 private $_result = null;
 /**
  * 校验数据信息
  * @var array
  */
 private $_resultInfo = array();
 /**
  * 构造函数
  * @param array $data 待校验数据
  */
 public function __construct($data = null)
 {
  if ($data) {
   $this->_data = $data;
  }
 }
 /**
  * 设置校验规则
  * @param string $var 带校验项key
  * @param mixed $rule 校验规则
  * @return void
  */
 public function setRule($var, $rule)
 {
  $this->_ruleList[$var] = $rule;
 }
 /**
  * 检验数据
  * @param array $data 
  * <code>
  * $data = array('nickname' => 'heno' , 'realname' => 'steven', 'age' => 25);
  * $validator = new Validator($data);
  * $validator->setRule('nickname', 'required');
  * $validator->setRule('realname', array('lenght' => array(1,4), 'required'));
  * $validator->setRule('age', array('required', 'digit'));
  * $result = $validator->validate();
  * var_dump($validator->getResultInfo());
  * </code>
  * @return bool
  */
 public function validate($data = null)
 {
  $result = true;
  /* 如果没有设置校验规则直接返回 true */
  if ($this->_ruleList === null || !count($this->_ruleList)) {
   return $result;
  }
  /* 已经设置规则,则对规则逐条进行校验 */
  foreach ($this->_ruleList as $ruleKey => $ruleItem) {
   /* 如果检验规则为单条规则 */
   if (!is_array($ruleItem)) {
    $ruleItem = trim($ruleItem);
    if (method_exists($this, $ruleItem)) {
     /* 校验数据,保存校验结果 */
     $tmpResult = $this->$ruleItem($ruleKey);
     if (!$tmpResult) {
      $this->_resultInfo[$ruleKey][$ruleItem] = $tmpResult;
      $result = false;
     }
    }
    continue;
   }
   /* 校验规则为多条 */
   foreach ($ruleItem as $ruleItemKey => $rule) {
    if (!is_array($rule)) {
     $rule = trim($rule);
     if (method_exists($this, $rule)) {
      /* 校验数据,设置结果集 */
      $tmpResult = $this->$rule($ruleKey);
      if (!$tmpResult) {
       $this->_resultInfo[$ruleKey][$rule] = $tmpResult;
       $result = false;
      }
     }
    } else {
     if (method_exists($this, $ruleItemKey)) {
      /* 校验数据,设置结果集 */
      $tmpResult = $this->$ruleItemKey($ruleKey, $rule);
      if (!$tmpResult) {
       $this->_resultInfo[$ruleKey][$ruleItemKey] = $tmpResult;
       $result = false;
      }
     }
    }
   }
  }
  return $result;
 }
 /**
  * 获取校验结果数据
  * @return [type] [description]
  */
 public function getResultInfo()
 {
  return $this->_resultInfo;
 }
 /**
  * 校验必填参数
  * @param string $varName 校验项
  * @return bool
  */
 public function required($varName) 
 {
  $result = false;
  if (is_array($this->_data) && isset($this->_data[$varName])) {
   $result = true;
  }
  return $result;
 }
 /**
  * 校验参数长度
  * 
  * @param string $varName 校验项
  * @param array $lengthData array($minLen, $maxLen)
  * @return bool
  */
 public function length($varName, $lengthData)
 {
  $result = true;
  /* 如果该项没有设置,默认为校验通过 */
  if ($this->required($varName)) {
   $varLen = mb_strlen($this->_data[$varName]);
   $minLen = $lengthData[0];
   $maxLen = $lengthData[1];
   if ($varLen < $minLen || $varLen > $maxLen) {
    $result = true;
   }
  }
  return $result;
 }
 /**
  * 校验邮件
  * @param string $varName 校验项
  * @return bool
  */
 public function email($varName)
 {
  $result = true;
  /* 如果该项没有设置,默认为校验通过 */
  if ($this->required($varName)) {
   $email = trim($this->_data[$varName]);
   if (preg_match('/^[-\w]+?@[-\w.]+?$/', $email)) {
    $result = false;
   }
  }
  return $result;
 }
 /**
  * 校验手机
  * @param string $varName 校验项
  * @return bool
  */
 public function mobile($varName)
 {
  $result = true;
  /* 如果该项没有设置,默认为校验通过 */
  if ($this->required($varName)) {
   $mobile = trim($this->_data[$varName]);
   if (!preg_match('/^1[3458]\d{10}$/', $mobile)) {
    $result = false;
   }
  }
  return $result;
 }
 /**
  * 校验参数为数字
  * @param string $varName 校验项
  * @return bool
  */
 public function digit($varName)
 {
  $result = false;
  if ($this->required($varName) && is_numeric($this->_data[$varName])) {
   $result = true;
  }
  return $result;
 }
 /**
  * 校验参数为身份证
  * @param string $varName 校验项
  * @return bool
  */
 public function ID($ID)
 {
 }
 /**
  * 校验参数为URL
  * @param string $varName 校验项
  * @return bool
  */
 public function url($url)
 {
  $result = true;
  /* 如果该项没有设置,默认为校验通过 */
  if ($this->required($varName)) {
   $url = trim($this->_data[$varName]);
   if(!preg_match('/^(http[s]?::)?\w+?(\.\w+?)$/', $url)) {
    $result = false;
   }
  }
  return $result;
 }
}
?>

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

PHP 相关文章推荐
PHP实现Socket服务器的代码
Apr 03 PHP
php面向对象全攻略 (十七) 自动加载类
Sep 30 PHP
解析php利用正则表达式解决采集内容排版的问题
Jun 20 PHP
php实现约瑟夫问题的方法小结
Mar 23 PHP
Zend Framework教程之请求对象的封装Zend_Controller_Request实例详解
Mar 07 PHP
PHP函数import_request_variables()用法分析
Apr 02 PHP
php多线程并发实现方法
Sep 30 PHP
PHP静态成员变量和非静态成员变量详解
Feb 14 PHP
PHP提取字符串中的手机号正则表达式怎么写
Jul 17 PHP
PHP面向对象五大原则之里氏替换原则(LSP)详解
Apr 08 PHP
Laravel利用gulp如何构建前端资源详解
Jun 03 PHP
laravel model模型定义实现开启自动管理时间created_at,updated_at
Oct 17 PHP
php类常量用法实例分析
Jul 09 #PHP
php求一个网段开始与结束IP地址的方法
Jul 09 #PHP
PHP实现全角字符转为半角方法汇总
Jul 09 #PHP
php将金额数字转化为中文大写
Jul 09 #PHP
php实现的简易扫雷游戏实例
Jul 09 #PHP
php链表用法实例分析
Jul 09 #PHP
php结合curl实现多线程抓取
Jul 09 #PHP
You might like
php &amp;&amp; 逻辑与运算符使用说明
2010/03/04 PHP
Zend Framework动作助手FlashMessenger用法详解
2016/03/05 PHP
PHP实现中国公民身份证号码有效性验证示例代码
2017/05/03 PHP
PHP 文件写入和读取操作实例详解【必看篇】
2019/11/04 PHP
jquery.alert 弹出式复选框实现代码
2009/06/15 Javascript
JQuery中SetTimeOut传参问题探讨
2013/05/10 Javascript
javascript获取鼠标点击元素对象(示例代码)
2013/12/20 Javascript
javascript数组操作总结和属性、方法介绍
2014/04/05 Javascript
对Web开发中前端框架与前端类库的一些思考
2015/03/27 Javascript
Jquery幻灯片特效代码分享--打开页面随机选择切换方式(3)
2015/08/15 Javascript
使用JavaScript为Kindeditor自定义按钮增加Audio标签
2016/03/18 Javascript
EasyUi 打开对话框后控件赋值及赋值后不显示的问题解决办法
2017/01/19 Javascript
Bootstrap datepicker日期选择器插件使用详解
2017/07/26 Javascript
echart简介_动力节点Java学院整理
2017/08/11 Javascript
详解如何在vue-cli中使用vuex
2018/08/07 Javascript
编写更好的JavaScript条件式和匹配条件的技巧(小结)
2019/06/27 Javascript
JavaScript解析JSON数据示例
2019/07/16 Javascript
js实现烟花特效
2020/03/02 Javascript
vue 判断页面是首次进入还是再次刷新的实例
2020/11/05 Javascript
利用Python代码实现数据可视化的5种方法详解
2018/03/25 Python
python dataframe常见操作方法:实现取行、列、切片、统计特征值
2018/06/09 Python
Python+OpenCV+pyQt5录制双目摄像头视频的实例
2019/06/28 Python
python for循环remove同一个list过程解析
2019/08/14 Python
Tensorflow分批量读取数据教程
2020/02/07 Python
logging level级别介绍
2020/02/21 Python
让IE支持CSS3的不完全兼容方案
2014/09/19 HTML / CSS
英国领先的奢侈品零售商之一:CRUISE
2016/12/02 全球购物
VisionPros美国站:加拿大在线隐形眼镜和眼镜零售商
2020/02/11 全球购物
煤矿安全生产标语
2014/06/06 职场文书
企业优秀团员事迹材料
2014/08/20 职场文书
汽车转让协议书范本
2014/12/07 职场文书
2014年艾滋病防治工作总结
2014/12/10 职场文书
2015年助残日活动总结
2015/03/27 职场文书
工程款催款函
2015/06/24 职场文书
mysql字符串截取函数小结
2021/04/05 MySQL
Python自动操作神器PyAutoGUI的使用教程
2022/06/16 Python