php验证数据的类_php实现的表单验证类完整示例

本文详细介绍了PHP中用于表单验证的类的实现,包括各种验证规则如邮箱、数字、长度等,并提供了静态调用和自定义规则的方法。通过示例展示了如何使用该验证类进行数据验证,并获取验证错误信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文实例讲述了php实现的表单验证类。分享给大家供大家参考,具体如下:

/**

* 用法

* use Validate\Validator;

*

* $rules = [

* ['name|名字', 'require|email|in:7,8,9|max:10|min:6|between:6,8|length:2', '名字不能为空|名字必须必须为正确的邮件地址'],

* ['test|测试', 'require'],

* ];

* $data = ['name' => '8gAg:'];

* $validator = new Validator($rules);

* $validator->addRule(['name|名字', 'regex', '/^[0-8|a-z]+$/', '正则验证失败哦']); //可以为二维数组,有|的正则验证只能通过addRule。

* $validator->validate($data);

* $validator->getAllErrors(); //获取所有验证错误 array

* $validator->getError(); //获取第一条验证错误 string

* Validator::in('7,8,9', 8); //静态调用

* Validator::isEmail('375373223@qq.com');

*/

namespace Validate;

class Validator {

//错误信息

private $error = [];

//传入的验证规则

private $validate = [];

//需要验证的参数

private $data = [];

//添加的规则

private $add_rules = [];

//默认错误提示

private $error_msg = [

'require' => ':attribute不能为空',

'number' => ':attribute必须为数字',

'array' => ':attribute必须为数组',

'float' => ':attribute必须为浮点数',

'boolean' => ':attribute必须为布尔值',

'email' => ':attribute必须为正确的邮件地址',

'url' => ':attribute必须为正确的url格式',

'ip' => ':attribute必须为正确的ip地址',

'timestamp' => ':attribute必须为正确的时间戳格式',

'date' => ':attribute必须为正确的日期格式',

'regex' => ':attribute格式不正确',

'in' => ':attribute必须在:range内',

'notIn' => ':attribute必须不在:range内',

'between' => ':attribute必须在:1-:2范围内',

'notBetween' => ':attribute必须不在:1-:2范围内',

'max' => ':attribute最大值为:1',

'min' => ':attribute最小值为:1',

'length' => ':attribute长度必须为:1',

'confirm' => ':attribute和:1不一致',

'gt' => ':attribute必须大于:1',

'lt' => ':attribute必须小于:1',

'egt' => ':attribute必须大于等于:1',

'elt' => ':attribute必须小于等于:1',

'eq' => ':attribute必须等于:1',

];

public function __construct($validate = null) {

$this->validate = $validate;

}

/**

* [validate 验证]

* @param [type] $data [需要验证的参数]

* @return [type] [boolean]

*/

public function validate($data) {

$this->data = $data;

foreach ($this->validate as $key => $item) {

$item_len = count($item);

$name = $item[0];

$rules = $item[1];

$rules = explode('|', $rules);

$message = $item_len > 2 ? explode('|', $item[2]) : null;

$this->check($name, $rules, $message);

}

if(!empty($this->add_rules)) {

$this->checkAddRules();

}

return empty($this->error) ? TRUE : FALSE;

}

/**

* [check 单个字段验证]

* @param [type] $name [description]

* @param [type] $rules [description]

* @param [type] $message [description]

* @return [type] [null]

*/

private function check($name, $rules, $message) {

//$title = $name;

$rule_name = $title = $name;

if(strpos($name, '|')) {

$rule_name = explode('|', $name)[0];

$title = explode('|', $name)[1];

}

foreach ($rules as $i => $rule) {

$validate_data = isset($this->data[$rule_name]) ? $this->data[$rule_name] : null;

$result = $this->checkResult($rule, $validate_data);

if(!$result) {

$error_info = isset($message[$i]) ? $message[$i] : $this->getMessage($title, $rule);

if($error_info) {

array_push($this->error, $error_info);

}

}

}

}

/**

* [getMessage 获取验证失败的信息]

* @param [type] $name [字段名]

* @param [type] $rule [验证规则]

* @return [type] [string OR fail false]

*/

private function getMessage($name, $rule) {

$value1 = '';

$value2 = '';

$range = '';

$error_key = $rule;

if(strpos($rule, ':')) {

$exp_arr = explode(':', $rule);

$error_key = $exp_arr[0];

$range = $exp_arr[1];

$message_value = explode(',', $exp_arr[1]);

$value1 = isset($message_value[0]) ? $message_value[0] : '';

$value2 = isset($message_value[1]) ? $message_value[1] : '';

}

if(isset($this->error_msg[$error_key])) {

return str_replace([':attribute', ':range', ':1', ':2'], [$name, $range, $value1, $value2], $this->error_msg[$error_key]);

}

return false;

}

/**

* [checkResult 字段验证]

* @param [type] $rule [验证规则]

* @param [type] $validate_data [需要验证的数据]

* @return [type] [boolean]

*/

private function checkResult($rule, $validate_data) {

switch ($rule) {

case 'require':

return $validate_data != '';

break;

case 'number':

return filter_var($validate_data, FILTER_SANITIZE_NUMBER_INT);

break;

case 'array':

return is_array($validate_data);

break;

case 'float':

return filter_var($validate_data, FILTER_VALIDATE_FLOAT);

break;

case 'boolean':

return filter_var($validate_data, FILTER_VALIDATE_BOOLEAN);

break;

case 'email':

return filter_var($validate_data, FILTER_VALIDATE_EMAIL);

break;

case 'url':

return filter_var($validate_data, FILTER_SANITIZE_URL);

case 'ip':

return filter_var($validate_data, FILTER_VALIDATE_IP);

break;

case 'timestamp':

return strtotime(date('Y-m-d H:i:s',$validate_data)) == $validate_data;

break;

case 'date': //2017-11-17 12:12:12

return strtotime($validate_data);

break;

default:

if(strpos($rule, ':')) {

$rule_arr = explode(':', $rule);

$func_name = substr($rule, strpos($rule, ':')+1);

return call_user_func_array([$this, $rule_arr[0]], [$func_name, $validate_data]);

}else{

return call_user_func_array([$this, $rule], [$rule, $validate_data]);

}

break;

}

}

/**

* [regex 正则验证]

* @param [type] $rule [description]

* @param [type] $data [description]

* @return [type] [description]

*/

public static function regex($rule, $data) {

return filter_var($data, FILTER_VALIDATE_REGEXP, ["options" => ["regexp" => $rule]]);

}

/**

* [addRule 添加规则格式 []]

* @param [type] $rule [description]

*/

public function addRule($rule) {

if(is_array(current($rule))) {

$this->add_rules = array_merge($this->add_rules, $rule);

}else{

array_push($this->add_rules, $rule);

}

}

/**

* [checkAddRules 添加新的规则的验证]

* @return [type] [description]

*/

public function checkAddRules() {

foreach ($this->add_rules as $key => $item) {

$name = $item[0];

$message = isset($item[3]) ? $item[3] : null;

$rule_name = $title = $name;

if(strpos($name, '|')) {

$rule_name = explode('|', $name)[0];

$title = explode('|', $name)[1];

}

$validate_data = isset($this->data[$rule_name]) ? $this->data[$rule_name] : null;

$result = $this->checkResult($item[1].':'.$item[2], $validate_data);

if(!$result) {

$error_info = isset($message) ? $message : $this->getMessage($title, $item[1]);

if($error_info) {

array_push($this->error, $error_info);

}

}

}

}

/**

* [in description]

* @param [type] $rule [验证规则]

* @param [type] $data [需要验证的数据]

* @return [type] [boolean]

*/

public static function in($rule, $data) {

if(!is_array($rule)) {

$rule = explode(',', $rule);

}

return in_array($data, $rule);

}

/**

* [in description]

* @param [type] $rule [验证规则]

* @param [type] $data [需要验证的数据]

* @return [type] [boolean]

*/

public static function notIn($rule, $data) {

return !$this->in($data, $rule);

}

/**

* [in description]

* @param [type] $rule [验证规则]

* @param [type] $data [需要验证的数据]

* @return [type] [boolean]

*/

public static function between($rule, $data) {

$rule = explode(',', $rule);

return $data >= $rule[0] && $data <= $rule[1];

}

/**

* [in description]

* @param [type] $rule [验证规则]

* @param [type] $data [需要验证的数据]

* @return [type] [boolean]

*/

public static function notBetween($rule, $data) {

return !$this->between($rule, $data);

}

/**

* [in description]

* @param [type] $rule [验证规则]

* @param [type] $data [需要验证的数据]

* @return [type] [boolean]

*/

public static function max($rule, $data) {

return $data <= $rule;

}

/**

* [in description]

* @param [type] $rule [验证规则]

* @param [type] $data [需要验证的数据]

* @return [type] [boolean]

*/

public static function min($rule, $data) {

return $data >= $rule;

}

/**

* [in description]

* @param [type] $rule [验证规则]

* @param [type] $data [需要验证的数据]

* @return [type] [boolean]

*/

public static function length($rule, $data) {

$length = is_array($data) ? count($data) : strlen($data);

return $length == $rule;

}

/**

* [in description]

* @param [type] $rule [验证规则]

* @param [type] $data [需要验证的数据]

* @return [type] [boolean]

*/

public static function confirm($rule, $data) {

return isset($this->data[$rule]) && $data == $this->data[$rule];

}

public static function gt($rule, $data) {

return $data > $rule;

}

public static function lt($rule, $data) {

return $data < $rule;

}

public static function egt($rule, $data) {

return $data >= $rule;

}

public static function elt($rule, $data) {

return $data <= $rule;

}

public static function eq($rule, $data) {

return $data == $rule;

}

/**

* [in 获取验证失败的第一条信息]

* @return [type] [string]

*/

public function getError() {

return count($this->error) > 0 ? $this->error[0] : null;

}

/**

* [getAllErrors 获取所有验证失败的信息]

* @return [type] [array]

*/

public function getAllErrors() {

return $this->error;

}

/**

* [__call 调用自定义函数或者]

* @param [type] $func [验证规则,函数名]

* @param [type] $data [验证数据]

* @return [type] [boollean]

*/

function __call($func, $data) {

$func_arr = get_defined_functions();

if(in_array($func,$func_arr['user'])) {

return call_user_func($func, $data);

}else{

array_push($this->error, '没有' . $func . '这个方法');

}

}

/**

* [__callStatic 静态方法调用自定义函数或者]

* @param [type] $func [验证规则,函数名]

* @param [type] $data [验证数据]

* @return [type] [boollean]

*/

public static function __callStatic($func, $data) {

if(substr($func, 0, 2) == 'is') {

return call_user_func_array([new self, 'checkResult'], [strtolower(substr($func, 2)), $data[0]]);

}

}

}

PS:这里再为大家提供2款非常方便的正则表达式工具供大家参考使用:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值