因为validator官方没有提供验证手机号码的逻辑,所以得自己定义
1.编写验证函数
// ValidateMobile
// 验证手机号码是否正确
func ValidateMobile(f1 validator.FieldLevel) bool {
mobile := f1.Field().String()
//使用正则表达式判断是否合法
ok, _ := regexp.MatchString(`^1([38][0-9]|14[579]|5[^4]|16[6]|7[1-35-8]|9[189])\d{8}$`, mobile)
return ok
}
2.配合gin的binding注册validator
//注册自定义的验证手机号码验证器
if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
//注册验证函数,只需在结构体的binding标签使用mobile就行
_ = v.RegisterValidation("mobile", myvalidator.ValidateMobile)
//自己定义的验证器没有中文翻译,官方的解决方案 "mobile": "Key: 'PassWordLoginForm.mobile' Error:Field validation for 'mobile' failed on the 'mobile' tag"
_ = v.RegisterTranslation("mobile", global.Trans, func(ut ut.Translator) error {
return ut.Add("mobile", "{0} 非法手机号码!", true)
}, func(ut ut.Translator, fe validator.FieldError) string {
t, _ := ut.T("mobile", fe.Field())
return t
})
}
3.定义接受验证数据的结构体,需要用注册验证器的指定标签使用 例如上述注册的“mobile”
type PassWordLoginForm struct {标签:自定义,验证,mobile,ut,binding,validator,手机号码 From: https://www.cnblogs.com/lunar-huazai/p/17135613.html
//用于接收表单的登陆参数
Mobile string `form:"mobile" json:"mobile" binding:"required,mobile"` //validator没有定义手机号验证。所以得自己定义一个号码验证
PassWord string `form:"password" json:"password" binding:"required,min=3,max=10"`
}