首頁 > 後端開發 > php教程 > 简单编写php验证类,教你如何写好php程序(含多种验证规则)_PHP教程

简单编写php验证类,教你如何写好php程序(含多种验证规则)_PHP教程

WBOY
發布: 2016-07-14 10:11:00
原創
1142 人瀏覽過

很多人在开发网站的时候往往只是通过简单的js验证,当你一不小心在js中多写了个逗号或者点号,ie6无法识别就直接跳过验证了。其实最安全的做法还是需要在服务端对用户输入的数据做验证的。本人写了个简单的php验证类,含多种验证规则,供大家学习参考。原文链接


[php] 
/**
 * 用户输入规则验证类
 * author   HaiNing Zhang
 * date     2013-05-23
 */ 
class Validate{ 
    // 验证规则  
    private $role_name = array( 
            // 验证是否为空  
            'required', 
 
            // 匹配邮箱  
            'email', 
 
            // 匹配身份证  
            'idcode', 
 
            // 匹配数字  
            'number', 
 
            // 匹配http地址  
            'http', 
 
            // 匹配qq号  
            'qq', 
 
            //匹配中国邮政编码  
            'postcode', 
 
            //匹配ip地址  
            'ip', 
 
            //匹配电话格式  
            'telephone', 
 
            // 匹配手机格式  
            'mobile', 
 
            //匹配26个英文字母  
            'en_word', 
 
            // 匹配只有中文  
            'cn_word', 
 
            // 验证账户(字母开头,由字母数字下划线组成,4-20字节)  
            'user_account', 
        ); 
 
    /**
     * [验证函数]
     * @param  [array] $data                [用户要验证的数据]
     * @param  [array] $validate_role       [验证规则]
     * @param  [array] $validate_err_msg    [错误信息提示]
     * @return [bool]                       [成功返回true, 失败返回错误信息]
     */ 
    public function verify($data, $validate_role, $validate_err_msg=''){ 
        if(empty($data)) return false; 
        if(empty($validate_role)) return false; 
        foreach ($data as $key => $value) { 
            $key = strtolower($key); 
            foreach ($validate_role as $kk => $vv) { 
                $kk = strtolower($kk); 
                if($key == $kk){ 
                    foreach ($vv as $k => $v) { 
                        $k = strtolower($k); 
                        if( !in_array($k, $this->role_name)) return 'role name "'.$k.'" is not found!'; 
                        if($v == true){ 
                            if ( !$this->$k($value) ){ 
                                if (!isset($validate_err_msg[$kk][$k])) 
                                return 'var '.$key.' in '.$k.' of regular validation failure!'; 
                                return $validate_err_msg[$kk][$k]; 
                            } 
                        } 
                    } 
                } 
            } 
        } 
        return true; 
    } 
 
    // 获取规则数组  
    public function get_role_name(){ 
        return $this->role_name; 
    } 
 
    // 设置属性规则  
    public function set_role_name($arr){ 
        $this->role_name = array_merge($this->role_name, $arr); 
    } 
 
    // 验证是否为空  
    public function required($str){ 
        if(trim($str) != "") return true; 
        return false; 
    } 
 
    // 验证邮件格式  
    public function email($str){ 
        if(preg_match("/^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/", $str)) return true; 
        else return false; 
    } 
 
    // 验证身份证  
    public function idcode($str){ 
        if(preg_match("/^\d{14}(\d{1}|\d{4}|(\d{3}[xX]))$/", $str)) return true; 
        else return false; 
    } 
 
    // 验证http地址  
    public function http($str){ 
        if(preg_match("/[a-zA-Z]+:\/\/[^\s]*/", $str)) return true; 
        else return false; 
    } 
 
    //匹配QQ号(QQ号从10000开始)  
    public function qq($str){ 
        if(preg_match("/^[1-9][0-9]{4,}$/", $str)) return true; 
        else return false; 
    } 
 
    //匹配中国邮政编码  
    public function postcode($str){ 
        if(preg_match("/^[1-9]\d{5}$/", $str)) return true; 
        else return false; 
    } 
 
    //匹配ip地址  
    public function ip($str){ 
        if(preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/", $str)) return true; 
        else return false; 
    } 
 
    // 匹配电话格式  
    public function telephone($str){ 
        if(preg_match("/^\d{3}-\d{8}$|^\d{4}-\d{7}$/", $str)) return true; 
        else return false; 
    } 
 
    // 匹配手机格式  
    public function mobile($str){ 
        if(preg_match("/^(13[0-9]|15[0-9]|18[0-9])\d{8}$/", $str)) return true; 
        else return false; 
    } 
 
    // 匹配26个英文字母  
    public function en_word($str){ 
        if(preg_match("/^[A-Za-z]+$/", $str)) return true; 
        else return false; 
    } 
 
    // 匹配只有中文  
    public function cn_word($str){ 
        if(preg_match("/^[\x80-\xff]+$/", $str)) return true; 
        else return false; 
    } 
 
    // 验证账户(字母开头,由字母数字下划线组成,4-20字节)  
    public function user_account($str){ 
        if(preg_match("/^[a-zA-Z][a-zA-Z0-9_]{3,19}$/", $str)) return true; 
        else return false; 
    } 
 
    // 验证数字  
    public function number($str){ 
        if(preg_match("/^[0-9]+$/", $str)) return true; 
        else return false; 
    } 

/**
 * 用户输入规则验证类
 * author  HaiNing Zhang
 * date  2013-05-23
 */
class Validate{
 // 验证规则
 private $role_name = array(
   // 验证是否为空
   'required',

   // 匹配邮箱
   'email',

   // 匹配身份证
   'idcode',

   // 匹配数字
   'number',

   // 匹配http地址
   'http',

   // 匹配qq号
   'qq',

   //匹配中国邮政编码
   'postcode',

   //匹配ip地址
   'ip',

   //匹配电话格式
   'telephone',

   // 匹配手机格式
   'mobile',

   //匹配26个英文字母
   'en_word',

   // 匹配只有中文
   'cn_word',

   // 验证账户(字母开头,由字母数字下划线组成,4-20字节)
   'user_account',
  );

 /**
  * [验证函数]
  * @param  [array] $data              [用户要验证的数据]
  * @param  [array] $validate_role     [验证规则]
  * @param  [array] $validate_err_msg  [错误信息提示]
  * @return [bool]                    [成功返回true, 失败返回错误信息]
  */
 public function verify($data, $validate_role, $validate_err_msg=''){
  if(empty($data)) return false;
  if(empty($validate_role)) return false;
  foreach ($data as $key => $value) {
   $key = strtolower($key);
   foreach ($validate_role as $kk => $vv) {
    $kk = strtolower($kk);
    if($key == $kk){
     foreach ($vv as $k => $v) {
      $k = strtolower($k);
      if( !in_array($k, $this->role_name)) return 'role name "'.$k.'" is not found!';
      if($v == true){
       if ( !$this->$k($value) ){
        if (!isset($validate_err_msg[$kk][$k]))
        return 'var '.$key.' in '.$k.' of regular validation failure!';
        return $validate_err_msg[$kk][$k];
       }
      }
     }
    }
   }
  }
  return true;
 }

 // 获取规则数组
 public function get_role_name(){
  return $this->role_name;
 }

 // 设置属性规则
 public function set_role_name($arr){
  $this->role_name = array_merge($this->role_name, $arr);
 }

 // 验证是否为空
 public function required($str){
  if(trim($str) != "") return true;
  return false;
 }

 // 验证邮件格式
 public function email($str){
  if(preg_match("/^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/", $str)) return true;
  else return false;
 }

 // 验证身份证
 public function idcode($str){
  if(preg_match("/^\d{14}(\d{1}|\d{4}|(\d{3}[xX]))$/", $str)) return true;
  else return false;
 }

 // 验证http地址
 public function http($str){
  if(preg_match("/[a-zA-Z]+:\/\/[^\s]*/", $str)) return true;
  else return false;
 }

 //匹配QQ号(QQ号从10000开始)
 public function qq($str){
  if(preg_match("/^[1-9][0-9]{4,}$/", $str)) return true;
  else return false;
 }

 //匹配中国邮政编码
 public function postcode($str){
  if(preg_match("/^[1-9]\d{5}$/", $str)) return true;
  else return false;
 }

 //匹配ip地址
 public function ip($str){
  if(preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/", $str)) return true;
  else return false;
 }

 // 匹配电话格式
 public function telephone($str){
  if(preg_match("/^\d{3}-\d{8}$|^\d{4}-\d{7}$/", $str)) return true;
  else return false;
 }

 // 匹配手机格式
 public function mobile($str){
  if(preg_match("/^(13[0-9]|15[0-9]|18[0-9])\d{8}$/", $str)) return true;
  else return false;
 }

 // 匹配26个英文字母
 public function en_word($str){
  if(preg_match("/^[A-Za-z]+$/", $str)) return true;
  else return false;
 }

 // 匹配只有中文
 public function cn_word($str){
  if(preg_match("/^[\x80-\xff]+$/", $str)) return true;
  else return false;
 }

 // 验证账户(字母开头,由字母数字下划线组成,4-20字节)
 public function user_account($str){
  if(preg_match("/^[a-zA-Z][a-zA-Z0-9_]{3,19}$/", $str)) return true;
  else return false;
 }

 // 验证数字
 public function number($str){
  if(preg_match("/^[0-9]+$/", $str)) return true;
  else return false;
 }
}
调用方法


[php] 
require('model/Validate.php'); 
$data = array( 
    "username"=>'ningofaura@gmail.com', 
    "qq"=>'593084029', 
    "nickname"=>'张海宁', 
    "id"=>'24', 
    ); 
$validate_role = array( 
    'username'=>array( 
        'required'=>true, 
        'email'=>true, 
        ), 
    'qq'=>array( 
        'required'=>true, 
        'qq'=>true, 
        ), 
    'nickname'=>array( 
        'required'=>true, 
        ), 
    'id'=>array( 
        'required'=>true, 
        'number'=>true, 
        ), 
    ); 
 
$validate_err_msg = array( 
    'username'=>array( 
        'required'=>"用户名不能为空", 
        'email'=>"邮箱格式不正确", 
        ), 
    'qq'=>array( 
        'required'=>"qq不能为空", 
        'qq'=>"qq格式不正确", 
        ), 
    'nickname'=>array( 
        'required'=>"昵称不能为空", 
        ), 
    'id'=>array( 
        'required'=>"id不能为空", 
        'number'=>"不是数字", 
        ), 
    ); 
$Validate = new Validate(); 
$rt = $Validate->verify($data, $validate_role, $validate_err_msg); 
if ($rt !== true){ 
    echo $rt; 
    exit; 

require('model/Validate.php');
$data = array(
    "username"=>'ningofaura@gmail.com',
    "qq"=>'593084029',
    "nickname"=>'张海宁',
    "id"=>'24',
    );
$validate_role = array(
    'username'=>array(
        'required'=>true,
        'email'=>true,
        ),
    'qq'=>array(
        'required'=>true,
        'qq'=>true,
        ),
    'nickname'=>array(
        'required'=>true,
        ),
    'id'=>array(
        'required'=>true,
        'number'=>true,
        ),
    );

$validate_err_msg = array(
    'username'=>array(
        'required'=>"用户名不能为空",
        'email'=>"邮箱格式不正确",
        ),
    'qq'=>array(
        'required'=>"qq不能为空",
        'qq'=>"qq格式不正确",
        ),
    'nickname'=>array(
        'required'=>"昵称不能为空",
        ),
    'id'=>array(
        'required'=>"id不能为空",
        'number'=>"不是数字",
        ),
    );
$Validate = new Validate();
$rt = $Validate->verify($data, $validate_role, $validate_err_msg);
if ($rt !== true){
    echo $rt;
    exit;
}

当然,如果你觉得验证无法满足你的需求,您还可以创建子类扩展您的方法


[php]
/**
 * 用户数据库异步验证
 * author   HaiNing Zhang
 * date     2013-05-23
 */ 
class AjaxValidate extends Validate{ 
    private $role_name = array( 
            // 验证用户名是否存在  
            'is_username', 
 
            // 验证昵称是否存在  
            'is_nickname', 
        ); 
 
    private $db; 
 
    public function __construct(){ 
        $this->db = &load_system("Database"); 
        $this->set_role_name($this->role_name); 
    } 
 
    // 判断用户名是否可以注册(防止用户名重复)  
    public function is_username($username){ 
        $_username = $this->db->filter('s', $username); 
        $sql = "select id from user where username =".$_username; 
        if($this->db->num_rows($sql)){ 
            return false; 
        }else{ 
            return true; 
        } 
    } 
 
    // 判断昵称是否可用(防止昵称重复)  
    public function is_nickname($nickname){ 
        $_nickname = $this->db->filter('s', $nickname); 
        $sql = "select id from user where nickname =".$_nickname; 
        if($this->db->num_rows($sql)){ 
            return false; 
        }else{ 
            return true; 
        } 
    } 

/**
 * 用户数据库异步验证
 * author HaiNing Zhang
 * date  2013-05-23
 */
class AjaxValidate extends Validate{
 private $role_name = array(
   // 验证用户名是否存在
   'is_username',

   // 验证昵称是否存在
   'is_nickname',
  );

 private $db;

 public function __construct(){
  $this->db = &load_system("Database");
  $this->set_role_name($this->role_name);
 }

 // 判断用户名是否可以注册(防止用户名重复)
 public function is_username($username){
  $_username = $this->db->filter('s', $username);
  $sql = "select id from user where username =".$_username;
  if($this->db->num_rows($sql)){
   return false;
  }else{
   return true;
  }
 }

 // 判断昵称是否可用(防止昵称重复)
 public function is_nickname($nickname){
  $_nickname = $this->db->filter('s', $nickname);
  $sql = "select id from user where nickname =".$_nickname;
  if($this->db->num_rows($sql)){
   return false;
  }else{
   return true;
  }
 }
}

 

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/477434.htmlTechArticle很多人在开发网站的时候往往只是通过简单的js验证,当你一不小心在js中多写了个逗号或者点号,ie6无法识别就直接跳过验证了。其实最安...
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板