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实现与ASP Banner组件相似的类
Oct 09 PHP
php设计模式  Command(命令模式)
Jun 17 PHP
浅析php学习的路线图
Jul 10 PHP
怎么在Windows系统中搭建php环境
Aug 31 PHP
destoon首页调用求购供应信息的地区名称的方法
Aug 21 PHP
PHP中使用Session配合Javascript实现文件上传进度条功能
Oct 15 PHP
php将金额数字转化为中文大写
Jul 09 PHP
手把手编写PHP框架 深入了解MVC运行流程
Sep 19 PHP
深入了解PHP中的Array数组和foreach
Nov 06 PHP
Thinkphp事务操作实例(推荐)
Apr 01 PHP
PHP多进程编程实例详解
Jul 19 PHP
Laravel5框架添加自定义辅助函数的方法
Aug 01 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/07/05 PHP
Yii中使用PHPExcel导出Excel的方法
2014/12/26 PHP
php获取远程文件内容的函数
2015/11/02 PHP
深入解析PHP中foreach语句控制数组循环的用法
2015/11/30 PHP
php基于dom实现读取图书xml格式数据的方法
2017/02/03 PHP
javascript contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
2010/02/04 Javascript
Javascript 鼠标移动上去小三角形滑块缓慢跟随效果
2013/04/26 Javascript
jqueyr判断checkbox组的选中(示例代码)
2013/11/08 Javascript
Javascript闭包与函数柯里化浅析
2016/06/22 Javascript
jQuery 实现ajax传入参数含有特殊字符的方法总结
2016/10/17 Javascript
Javascript 实现计算器时间功能详解及实例(二)
2017/01/08 Javascript
微信小程序 滚动到某个位置添加class效果实现代码
2017/04/19 Javascript
Express + Session 实现登录验证功能
2017/09/08 Javascript
vue项目中公用footer组件底部位置的适配问题
2018/05/10 Javascript
vue将毫秒数转化为正常日期格式的实例
2018/09/16 Javascript
详解Python函数作用域的LEGB顺序
2016/05/14 Python
Python部署web开发程序的几种方法
2017/05/05 Python
Ubuntu 下 vim 搭建python 环境 配置
2017/06/12 Python
python 字符串追加实例
2019/07/20 Python
Python使用scrapy爬取阳光热线问政平台过程解析
2019/08/14 Python
Python利用逻辑回归模型解决MNIST手写数字识别问题详解
2020/01/14 Python
Django模板获取field的verbose_name实例
2020/05/19 Python
sklearn线性逻辑回归和非线性逻辑回归的实现
2020/06/09 Python
XD健身器材:Kevlar球、Crossfit健身球
2019/03/26 全球购物
综合测评自我鉴定
2013/10/08 职场文书
应届生船舶驾驶求职信
2013/10/19 职场文书
金融专业推荐信
2013/11/14 职场文书
机电专业大学生职业规划书范文
2014/02/25 职场文书
企业活动策划方案
2014/06/02 职场文书
党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
2014年财务科工作总结
2014/11/11 职场文书
2014年秘书工作总结
2014/11/25 职场文书
2015年英语教研组工作总结
2015/05/23 职场文书
医院消毒隔离制度
2015/08/05 职场文书
解决Python中的modf()函数取小数部分不准确问题
2021/05/28 Python
JS轻量级函数式编程实现XDM三
2022/06/16 Javascript