php通用验证规则

php通用验证规则:

<?php
/**
 * 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;
    }

}

使用方法:

<?php
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 "<pre>";
        print_r($err);
        echo "</pre>";
    } else {
        echo '没有发现错误!';
    }

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SHUIPING_YANG

你的鼓励是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值