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

很多人在开发网站的时候往往只是通过简单的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;
	}
}

调用方法

<?php
require('model/Validate.php');
$data = array(
    "username"=>'[email protected]',
    "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;
		}
	}
}


猜你喜欢

转载自blog.csdn.net/php_897721669/article/details/8965811