/**
* Created by PhpStorm.
* User: jiqing
* Date: 18-7-24
* Time: 下午4:36
* 常用验证
*/
class Validator {
static protected $error;
/**
* 灵活获取参数
* @param $rule
* @param $param
*/
public static function get_errors($rule, $param) {
$error_tips = [
'telephone' => '手机号格式有误!',
'email' => '不是有效的邮箱格式!',
'max_len' => '参数长度不能超过最大长度' . $param,
'min_len' => '参数长度不能小于最小长度' . $param,
'between_len' => '参数不在有效长度区间!',
'required' => '参数不能为空!',
'json' => '参数不是有效的json格式!',
];
return $error_tips[$rule] ? $error_tips[$rule] : '参数格式有误';
}
/**
* 验证
* @Author yangshuiping
* @DateTime 2019-08-20T13:01:12+0800
* @param [type] $input [description]
* @param [type] $rules [description]
* @return [type] [description]
*/
public static function validate($input, $rules) {
foreach ($rules as $field => $rules) {
#判断参数是否有多级
if (strpos($field, '.') != false) {
$strings = explode('.', $field);
#为简单起见,目前只支持两级
if (count($strings) > 2) {
throw new Exception($field . '层级超过限制!目前最多支持二级!', 1);
}
$input[$field] = $input[$strings[0]][$strings[1]];
}
#只有一级参数
if ((!isset($input[$field])) || empty($input[$field])) {
self::$error[$field] = '缺少参数' . $field . ',请检查!';
}
#分割规则,|作为分隔符,:作为参数符
$rules = explode('|', $rules);
foreach ($rules as $rule) {
$method = null;
$param = null;
//判断参数里面是否有额外规则
if (strpos($rule, ':') !== false) {
$rule = explode(':', $rule);
$method = 'check_' . $rule[0];
$param = $rule[1];
$rule = $rule[0];
} else {
$method = 'check_' . $rule;
}
$method_array = get_class_methods('Validator');
if (!in_array($method, $method_array)) {
self::$error[$method] = $method . ' Method not exist.';
} elseif (isset($input[$field]) && (!self::$method($input[$field], $param))) {
// 通过规则获取错误信息 marked by yangshuiping <2019-08-20 12:23:11>
self::$error[$field] = self::get_errors($rule, $param);
}
}
}
if (count(self::$error) == 0) {
return array();
}
return self::$error; // 返回所有
}
/**
* 必填,不能为空
* @Author yangshuiping
* @DateTime 2019-08-20T11:26:01+0800
* @param [type] $field [description]
* @return [type] [description]
*/
public static function check_required($field) {
if (!empty($field)) {
return true;
}
return false;
}
/**
* 验证手机号码(待拓展)
* @Author yangshuiping
* @DateTime 2019-08-20T11:26:20+0800
* @param [type] $field [description]
* @return [type] [description]
*/
public static function check_telephone($field) {
if (preg_match('/^1[345678]{1}\d{9}$/', $field)) {
return true;
}
return false;
}
/**
* 检测是否超长
* @Author yangshuiping
* @DateTime 2019-08-20T11:27:02+0800
* @param [type] $field [参数值]
* @param [type] $param [额外规则的值]
* @return [type] [description]
*/
public static function check_max_len($field, $param = null) {
if (function_exists('mb_strlen')) {
if (mb_strlen($field) <= (int) $param) {
return true;
}
return false;
} else {
if (strlen($field) <= (int) $param) {
return true;
}
return false;
}
}
/**
* 检测长度是否不够
* @Author yangshuiping
* @DateTime 2019-08-20T11:27:16+0800
* @param [type] $field [参数值]
* @param [type] $param [额外规则的值]
* @return [type] [description]
*/
public static function check_min_len($field, $param = null) {
if (function_exists('mb_strlen')) {
if (mb_strlen($field) >= (int) $param) {
return true;
}
return false;
} else {
if (strlen($field) >= (int) $param) {
return true;
}
return false;
}
}
/**
* 字符串长度区间检测
* @Author yangshuiping
* @DateTime 2019-08-20T12:35:04+0800
* @param [type] $field [description]
* @param [type] $param [description]
* @return [type] [description]
*/
public static function check_between_len($field, $param = null) {
$params = explode(',', $param);
if (count($params) !== 2) {
throw new Exception('between规则有误!正确示例:between_len:10,20', 1);
} else {
$min_len = self::check_min_len($field, $params[0]);
$max_len = self::check_max_len($field, $params[1]);
return $min_len && $max_len;
}
}
public static function check_in($field, $param = null) {
$count = explode(',', $param);
}
/**
* 验证正则
* @Author yangshuiping
* @DateTime 2019-08-20T11:27:49+0800
* @param [type] $field [description]
* @param [type] $param [description]
* @return [type] [description]
*/
public static function check_regex($field, $param = null) {
$regex = $param;
if (preg_match($regex, $field)) {
return true;
}
return false;
}
/**
* 检测IP地址
* @Author yangshuiping
* @DateTime 2019-08-20T12:35:57+0800
* @param [type] $value [description]
* @return [type] [description]
*/
public static function check_ip($value) {
return filter_var($value, FILTER_VALIDATE_IP) !== false;
}
/**
* 检测ip4
* @Author yangshuiping
* @DateTime 2019-08-20T12:36:06+0800
* @param [type] $value [description]
* @return [type] [description]
*/
public static function check_ipv4($value) {
return filter_var($value, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== false;
}
/**
* 检测ip6
* @Author yangshuiping
* @DateTime 2019-08-20T12:36:14+0800
* @param [type] $value [description]
* @return [type] [description]
*/
public static function check_ipv6($value) {
return filter_var($value, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) !== false;
}
/**
* 检测json
* @Author yangshuiping
* @DateTime 2019-08-20T12:36:22+0800
* @param [type] $value [description]
* @return [type] [description]
*/
public static function check_json($value) {
if (!is_scalar($value) && !method_exists($value, '__toString')) {
return false;
}
json_decode($value);
return json_last_error() === JSON_ERROR_NONE;
}
/**
* 检测是否是数字
* @Author yangshuiping
* @DateTime 2019-08-20T12:36:42+0800
* @param [type] $value [description]
* @return [type] [description]
*/
public static function check_numeric($value) {
return is_numeric($value);
}
/**
* 检测是否是时区
* @Author yangshuiping
* @DateTime 2019-08-20T12:36:55+0800
* @param [type] $value [description]
* @return [type] [description]
*/
public static function check_timezone($value) {
try {
new DateTimeZone($value);
} catch (Exception $e) {
return false;
} catch (Throwable $e) {
return false;
}
return true;
}
/**
* 检测是否是邮箱
* @Author yangshuiping
* @DateTime 2019-08-20T12:37:03+0800
* @param [type] $value [description]
* @return [type] [description]
*/
public static function check_email($value) {
return filter_var($value, FILTER_VALIDATE_EMAIL) !== false;
}
/**
* 检测是否是url
* @Author yangshuiping
* @DateTime 2019-08-20T12:37:11+0800
* @param [type] $value [description]
* @return [type] [description]
*/
public static function check_url($value) {
if (!is_string($value)) {
return false;
}
if ($url = parse_url($value, PHP_URL_HOST)) {
try {
return count(dns_get_record($url, DNS_A | DNS_AAAA)) > 0;
} catch (Exception $e) {
return false;
}
}
return false;
}
}
require 'helper/Validator.php';
$validators = [
'telephone' => 'required|telephone',
'username' => 'required',
'json' => 'required|json',
// 'test.name.aa' => 'required|min_len:20|aa',
'email' => 'required|email|max_len:1',
'password' => 'required|min_len:6|max_len:12',
];
if ($err = Validator::validate($validators, $_POST)) {
if ($err) {
echo ""
;
print_r($err);
echo "
";
} else {
echo '没有发现错误!';
}
}