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的网址
Nov 25 PHP
php getsiteurl()函数
Sep 05 PHP
解析PHP实现下载文件的两种方法
Jul 05 PHP
PHP中数组定义的几种方法
Sep 01 PHP
php使用mb_check_encoding检查字符串在指定的编码里是否有效
Nov 07 PHP
php获取中文拼音首字母类和函数分享
Apr 24 PHP
php微信公众账号开发之前五个坑(一)
Sep 18 PHP
thinkPHP商城公告功能开发问题分析
Dec 01 PHP
PHP自动补全表单的两种方法
Mar 06 PHP
PHP使用微信开发模式实现搜索已发送图文及匹配关键字回复的方法
Sep 13 PHP
Yii2 中实现单点登录的方法
Mar 09 PHP
PHP 计算两个时间段之间交集的天数示例
Oct 24 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实现删除指定目录下相关文件的方法
2014/10/20 PHP
HTML页面如何象ASP一样接受参数
2007/02/07 Javascript
JavaScript中的事件处理
2008/01/16 Javascript
js取得url地址参数实例
2013/02/22 Javascript
有关于JS构造函数的重载和工厂方法
2013/04/07 Javascript
jQuery中replaceWith()方法用法实例
2014/12/25 Javascript
AngularJS实现元素显示和隐藏的几个案例
2015/12/09 Javascript
js代码实现点击按钮出现60秒倒计时
2021/01/28 Javascript
javascript结合Flexbox简单实现滑动拼图游戏
2016/02/18 Javascript
JavaScript数组方法总结分析
2016/05/06 Javascript
JS中对Cookie的操作详解
2016/08/05 Javascript
JavaScript浏览器对象模型BOM(BrowserObjectModel)实例详解
2016/11/29 Javascript
浅谈vue的踩坑路
2017/08/31 Javascript
解决vue-router在同一个路由下切换,取不到变化的路由参数问题
2018/09/01 Javascript
Vue仿Bibibili首页的问题
2021/01/21 Vue.js
python中format()函数的简单使用教程
2018/03/14 Python
python绘制多个子图的实例
2019/07/07 Python
Python之指数与E记法的区别详解
2019/11/21 Python
利用PyCharm操作Github(仓库新建、更新,代码回滚)
2019/12/18 Python
将数据集制作成VOC数据集格式的实例
2020/02/17 Python
django 链接多个数据库 并使用原生sql实现
2020/03/28 Python
python中常见错误及解决方法
2020/06/21 Python
Pytorch 扩展Tensor维度、压缩Tensor维度的方法
2020/09/09 Python
html5在移动端的屏幕适应问题示例探讨
2014/06/15 HTML / CSS
华丽的手绘陶瓷:MacKenzie-Childs
2017/02/04 全球购物
Bailey帽子官方商店:Bailey Hats
2018/09/25 全球购物
台湾专柜女包:KINAZ
2019/12/26 全球购物
thinkphp5 redis缓存新增方法实例讲解
2021/03/24 PHP
党员党性分析材料
2014/02/17 职场文书
《音乐之都维也纳》教学反思
2014/04/16 职场文书
村庄环境整治方案
2014/05/15 职场文书
医院合作协议书
2014/08/19 职场文书
大班下学期个人总结
2015/02/13 职场文书
2015年感恩父亲节演讲稿
2015/03/19 职场文书
PHP中国际化的字符串排序和比较对象详解
2021/08/23 PHP
在 Python 中利用 Pool 进行多线程
2022/04/24 Python