gf/g/util/gvalid/gvalid.go
2019-01-16 13:35:16 +08:00

101 lines
7.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Copyright 2017-2018 gf Author(https://gitee.com/johng/gf). All Rights Reserved.
//
// This Source Code Form is subject to the terms of the MIT License.
// If a copy of the MIT was not distributed with this file,
// You can obtain one at https://gitee.com/johng/gf.
// Package gvalid implements powerful and useful data/form validation functionality.
//
// 数据/表单校验.
package gvalid
import (
"gitee.com/johng/gf/g/util/gregex"
"strings"
)
/*
参考https://laravel.com/docs/5.5/validation#available-validation-rules
规则如下:
required 格式required 说明:必需参数
required-if 格式required-if:field,value,... 说明:必需参数(当任意所给定字段值与所给值相等时当field字段的值为value时当前验证字段为必须参数)
required-unless 格式required-unless:field,value,... 说明:必需参数(当所给定字段值与所给值都不相等时当field字段的值不为value时当前验证字段为必须参数)
required-with 格式required-with:field1,field2,... 说明:必需参数(当所给定任意字段值不为空时)
required-with-all 格式required-with-all:field1,field2,... 说明:必须参数(当所给定所有字段值都不为空时)
required-without 格式required-without:field1,field2,... 说明:必需参数(当所给定任意字段值为空时)
required-without-all 格式required-without-all:field1,field2,...说明:必须参数(当所给定所有字段值都为空时)
date 格式date 说明参数为常用日期类型格式2006-01-02, 20060102, 2006.01.02
date-format 格式date-format:format 说明判断日期是否为指定的日期格式format为Go日期格式(可以包含时间)
email 格式email 说明EMAIL邮箱地址
phone 格式phone 说明:手机号
telephone 格式telephone 说明:国内座机电话号码,"XXXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"、"XXXXXXXX"
passport 格式passport 说明:通用帐号规则(字母开头只能包含字母、数字和下划线长度在6~18之间)
password 格式password 说明:通用密码(任意可见字符长度在6~18之间)
password2 格式password2 说明:中等强度密码(在弱密码的基础上,必须包含大小写字母和数字)
password3 格式password3 说明:强等强度密码(在弱密码的基础上,必须包含大小写字母、数字和特殊字符)
postcode 格式postcode 说明:中国邮政编码
id-number 格式id-number 说明:公民身份证号码
qq 格式qq 说明腾讯QQ号码
ip 格式ip 说明IPv4/IPv6地址
ipv4 格式ipv4 说明IPv4地址
ipv6 格式ipv6 说明IPv6地址
mac 格式mac 说明MAC地址
url 格式url 说明URL
domain 格式domain 说明:域名
length 格式length:min,max 说明参数长度为min到max(长度参数为整形)注意中文一个汉字占3字节
min-length 格式min-length:min 说明参数长度最小为min(长度参数为整形)注意中文一个汉字占3字节
max-length 格式max-length:max 说明参数长度最大为max(长度参数为整形)注意中文一个汉字占3字节
between 格式between:min,max 说明参数大小为min到max(支持整形和浮点类型参数)
min 格式min:min 说明参数最小为min(支持整形和浮点类型参数)
max 格式max:max 说明参数最大为max(支持整形和浮点类型参数)
json 格式json 说明判断数据格式为JSON
integer 格式integer 说明:整数
float 格式float 说明:浮点数
boolean 格式boolean 说明:布尔值(1,true,on,yes:true | 0,false,off,no,"":false)
same 格式same:field 说明参数值必需与field参数的值相同
different 格式different:field 说明参数值不能与field参数的值相同
in 格式in:value1,value2,... 说明参数值应该在value1,value2,...中(字符串匹配)
not-in 格式not-in:value1,value2,... 说明参数值不应该在value1,value2,...中(字符串匹配)
regex 格式regex:pattern 说明参数值应当满足正则匹配规则pattern
*/
// 自定义错误信息: map[键名] => 字符串|map[规则]错误信息
type CustomMsg = map[string]interface{}
// 解析单条sequence tag格式: [数值键名/别名@]校验规则[#错误提示]
// 其中校验规则如果有多个那么以"|"符号分隔,错误提示同理。
func parseSequenceTag(tag string) (name, rule, msg string) {
match, _ := gregex.MatchString(`\s*((\w+)\s*@){0,1}\s*([^#]+)\s*(#\s*(.*)){0,1}\s*`, tag)
return strings.TrimSpace(match[2]), strings.TrimSpace(match[3]), strings.TrimSpace(match[5])
}
// 解析sequence tag为标准校验规则及自定义错误
func parseSequenceTags(tags []string) (rules map[string]string, msgs map[string]interface{}) {
rules = make(map[string]string)
msgs = make(map[string]interface{})
for _, tag := range tags {
name, rule, msg := parseSequenceTag(tag)
// 校验规则
if len(name) == 0 {
continue
}
rules[name] = rule
// 错误提示
if len(msg) > 0 {
ruleArray := strings.Split(rule, "|")
msgArray := strings.Split(msg, "|")
for k, v := range ruleArray {
if len(msgArray[k]) == 0 {
continue
}
// 关联校验会有":"符号
array := strings.Split(v, ":")
if _, ok := msgs[name]; !ok {
msgs[name] = make(map[string]string)
}
msgs[name].(map[string]string)[strings.TrimSpace(array[0])] = strings.TrimSpace(msgArray[k])
}
}
}
return
}