同步操作将从 Nicky/validate 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
The package is a generic Go data validate and filter tool library.
Map
, Struct
, Request
(Form
, JSON
, url.Values
, UploadedFile
) dataen
, zh-CN
Inspired the projects albrow/forms and asaskevich/govalidator and inhere/php-validate. Thank you very much
With the TAG tag of the structure, you can quickly verify a structure data.
And provides extended functionality:
The struct can implement three interface methods, which is convenient to do some customization:
ConfigValidation(v *Validation)
will be called after the validator instance is createdMessages() map[string]string
can customize the validator error messageTranslates() map[string]string
can customize field translationv1.2.1
Update:
json
tag by defaultmessage
tagpackage main
import (
"fmt"
"time"
"github.com/gookit/validate"
)
// UserForm struct
type UserForm struct {
Name string `validate:"required|minLen:7"`
Email string `validate:"email" message:"email is invalid"`
Age int `validate:"required|int|min:1|max:99" message:"int:age must int| min: age min value is 1"`
CreateAt int `validate:"min:1"`
Safe int `validate:"-"`
UpdateAt time.Time `validate:"required"`
Code string `validate:"customValidator"`
}
// CustomValidator custom validator in the source struct.
func (f UserForm) CustomValidator(val string) bool {
return len(val) == 4
}
// Messages you can custom validator error messages.
func (f UserForm) Messages() map[string]string {
return validate.MS{
"required": "oh! the {field} is required",
"Name.required": "message for special field",
}
}
// Translates you can custom field translates.
func (f UserForm) Translates() map[string]string {
return validate.MS{
"Name": "User Name",
"Email": "User Email",
}
}
func main() {
u := &UserForm{
Name: "inhere",
}
v := validate.Struct(u)
// v := validate.New(u)
if v.Validate() { // validate ok
// do something ...
} else {
fmt.Println(v.Errors) // all error messages
fmt.Println(v.Errors.One()) // returns a random error message text
fmt.Println(v.Errors.Field("Name")) // returns error messages of the field
}
}
You can also validate a MAP data directly.
package main
import "fmt"
import "time"
import "github.com/gookit/validate"
func main() {
m := map[string]interface{}{
"name": "inhere",
"age": 100,
"oldSt": 1,
"newSt": 2,
"email": "some@email.com",
}
v := validate.Map(m)
// v := validate.New(m)
v.AddRule("name", "required")
v.AddRule("name", "minLen", 7)
v.AddRule("age", "max", 99)
v.AddRule("age", "min", 1)
v.AddRule("email", "email")
// can also
v.StringRule("age", "required|int|min:1|max:99")
v.StringRule("name", "required|minLen:7")
// v.WithScenes(map[string]string{
// "create": []string{"name", "email"},
// "update": []string{"name"},
// })
if v.Validate() { // validate ok
safeData := v.SafeData()
// do something ...
} else {
fmt.Println(v.Errors) // all error messages
fmt.Println(v.Errors.One()) // returns a random error message text
}
}
If it is an HTTP request, you can quickly validate the data and pass the verification. Then bind the secure data to the structure.
package main
import (
"fmt"
"net/http"
"time"
"github.com/gookit/validate"
)
// UserForm struct
type UserForm struct {
Name string
Email string
Age int
CreateAt int
Safe int
UpdateAt time.Time
Code string
}
func main() {
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
data, err := validate.FromRequest(r)
if err != nil {
panic(err)
}
v := data.Create()
// setting rules
v.FilterRule("age", "int") // convert value to int
v.AddRule("name", "required")
v.AddRule("name", "minLen", 7)
v.AddRule("age", "max", 99)
v.FieldRule("code", `required|regex:\d{4,6}`)
if v.Validate() { // validate ok
// safeData := v.SafeData()
userForm := &UserForm{}
v.BindSafeData(userForm)
// do something ...
fmt.Println(userForm.Name)
} else {
fmt.Println(v.Errors) // all error messages
fmt.Println(v.Errors.One()) // returns a random error message text
}
})
http.ListenAndServe(":8090", handler)
}
Quick create Validation
instance.
New(data interface{}, scene ...string) *Validation
Request(r *http.Request) *Validation
JSON(s string, scene ...string) *Validation
Struct(s interface{}, scene ...string) *Validation
Map(m map[string]interface{}, scene ...string) *Validation
Quick create DataFace
instance.
FromMap(m map[string]interface{}) *MapData
FromStruct(s interface{}) (*StructData, error)
FromJSON(s string) (*MapData, error)
FromJSONBytes(bs []byte) (*MapData, error)
FromURLValues(values url.Values) *FormData
FromRequest(r *http.Request, maxMemoryLimit ...int64) (DataFace, error)
Create
Validation
byDataFace
d := FromMap(map[string]interface{}{"key": "val"})
v := d.Validation()
// GlobalOption settings for validate
type GlobalOption struct {
// FilterTag name in the struct tags.
FilterTag string
// ValidateTag in the struct tags.
ValidateTag string
// StopOnError If true: An error occurs, it will cease to continue to verify
StopOnError bool
// SkipOnEmpty Skip check on field not exist or value is empty
SkipOnEmpty bool
}
Usage:
// change global opts
validate.Config(func(opt *validate.GlobalOption) {
opt.StopOnError = false
opt.SkipOnEmpty = false
})
validate
supports adding custom validators, and supports adding global validator
and temporary validator
.
Note: The validator method must return a
bool
to indicate whether the validation was successful. The first parameter is the corresponding field value. If there are additional parameters, they will be appended automatically.
You can add one or more custom validators at once.
validate.AddValidator("myCheck0", func(val interface{}) bool {
// do validate val ...
return true
})
validate.AddValidators(M{
"myCheck1": func(val interface{}) bool {
// do validate val ...
return true
},
})
Again, you can add one or more custom validators at once.
v := validate.Struct(u)
v.AddValidator("myFunc3", func(val interface{}) bool {
// do validate val ...
return true
})
v.AddValidators(M{
"myFunc4": func(val interface{}) bool {
// do validate val ...
return true
},
})
Camel-style validator names now have underlined aliases.
endsWith
can also be written asends_with
validator/aliases | description |
---|---|
required |
Check value is required and cannot be empty. |
requiredIf |
required_if:anotherfield,value,... The field under validation must be present and not empty if the anotherField field is equal to any value. |
requiredUnless |
required_unless:anotherfield,value,... The field under validation must be present and not empty unless the anotherField field is equal to any value. |
requiredWith |
required_with:foo,bar,... The field under validation must be present and not empty only if any of the other specified fields are present. |
requiredWithAll |
required_with_all:foo,bar,... The field under validation must be present and not empty only if all of the other specified fields are present. |
requiredWithout |
required_without:foo,bar,... The field under validation must be present and not empty only when any of the other specified fields are not present. |
requiredWithoutAll |
required_without_all:foo,bar,... The field under validation must be present and not empty only when all of the other specified fields are not present. |
-/safe |
The field values are safe and do not require validation |
int/integer/isInt |
Check value is intX uintX type, And support size checking. eg: "int" "int:2" "int:2,12"
|
uint/isUint |
Check value is uint(uintX ) type, value >= 0
|
bool/isBool |
Check value is bool string(true : "1", "on", "yes", "true", false : "0", "off", "no", "false"). |
string/isString |
Check value is string type. |
float/isFloat |
Check value is float(floatX ) type |
slice/isSlice |
Check value is slice type([]intX []uintX []byte []string ...). |
in/enum |
Check if the value is in the given enumeration |
notIn |
Check if the value is not in the given enumeration |
contains |
Check if the input value contains the given value |
not_contains/notContains |
Check if the input value not contains the given value |
string_contains/stringContains |
Check if the input string value is contains the given sub-string |
starts_with/startsWith |
Check if the input string value is starts with the given sub-string |
ends_with/endsWith |
Check if the input string value is ends with the given sub-string |
range/between |
Check that the value is a number and is within the given range |
max/lte |
Check value is less than or equal to the given value |
min/gte |
Check value is greater than or equal to the given value(for intX uintX floatX ) |
eq/equal/isEqual |
Check that the input value is equal to the given value |
ne/notEq/notEqual |
Check that the input value is not equal to the given value |
lt/lessThan |
Check value is less than the given value(use for intX uintX floatX ) |
gt/greaterThan |
Check value is greater than the given value(use for intX uintX floatX ) |
email/isEmail |
Check value is email address string. |
intEq/intEqual |
Check value is int and equals to the given value. |
len/length |
Check value length is equals to the given size(use for string array slice map ). |
regex/regexp |
Check if the value can pass the regular verification |
arr/array/isArray |
Check value is array type |
map/isMap |
Check value is a MAP type |
strings/isStrings |
Check value is string slice type(only allow []string ). |
ints/isInts |
Check value is int slice type(only allow []int ). |
minLen/minLength |
Check the minimum length of the value is the given size |
maxLen/maxLength |
Check the maximum length of the value is the given size |
eq_field/eqField |
Check that the field value is equals to the value of another field |
ne_field/neField |
Check that the field value is not equals to the value of another field |
gte_field/gteField |
Check that the field value is greater than or equal to the value of another field |
gt_field/gtField |
Check that the field value is greater than the value of another field |
lte_field/lteField |
Check if the field value is less than or equal to the value of another field |
lt_field/ltField |
Check that the field value is less than the value of another field |
file/isFile |
Verify if it is an uploaded file |
image/isImage |
Check if it is an uploaded image file and support suffix check |
mime/mimeType/inMimeTypes |
Check that it is an uploaded file and is in the specified MIME type |
date/isDate |
Check the field value is date string. eg 2018-10-25
|
gtDate/afterDate |
Check that the input value is greater than the given date string. |
ltDate/beforeDate |
Check that the input value is less than the given date string |
gteDate/afterOrEqualDate |
Check that the input value is greater than or equal to the given date string. |
lteDate/beforeOrEqualDate |
Check that the input value is less than or equal to the given date string. |
hasWhitespace |
Check value string has Whitespace. |
ascii/ASCII/isASCII |
Check value is ASCII string. |
alpha/isAlpha |
Verify that the value contains only alphabetic characters |
alphaNum/isAlphaNum |
Check that only letters, numbers are included |
alphaDash/isAlphaDash |
Check to include only letters, numbers, dashes ( - ), and underscores ( _ ) |
multiByte/isMultiByte |
Check value is MultiByte string. |
base64/isBase64 |
Check value is Base64 string. |
dnsName/DNSName/isDNSName |
Check value is DNSName string. |
dataURI/isDataURI |
Check value is DataURI string. |
empty/isEmpty |
Check value is Empty string. |
hexColor/isHexColor |
Check value is Hex color string. |
hexadecimal/isHexadecimal |
Check value is Hexadecimal string. |
json/JSON/isJSON |
Check value is JSON string. |
lat/latitude/isLatitude |
Check value is Latitude string. |
lon/longitude/isLongitude |
Check value is Longitude string. |
mac/isMAC |
Check value is MAC string. |
num/number/isNumber |
Check value is number string. >= 0
|
cn_mobile/cnMobile/isCnMobile |
Check value is china mobile number string. |
printableASCII/isPrintableASCII |
Check value is PrintableASCII string. |
rgbColor/RGBColor/isRGBColor |
Check value is RGB color string. |
url/isURL |
Check value is URL string. |
fullUrl/isFullURL |
Check value is full URL string(must start with http,https). |
ip/isIP |
Check value is IP(v4 or v6) string. |
ipv4/isIPv4 |
Check value is IPv4 string. |
ipv6/isIPv6 |
Check value is IPv6 string. |
CIDR/isCIDR |
Check value is CIDR string. |
CIDRv4/isCIDRv4 |
Check value is CIDRv4 string. |
CIDRv6/isCIDRv6 |
Check value is CIDRv6 string. |
uuid/isUUID |
Check value is UUID string. |
uuid3/isUUID3 |
Check value is UUID3 string. |
uuid4/isUUID4 |
Check value is UUID4 string. |
uuid5/isUUID5 |
Check value is UUID5 string. |
filePath/isFilePath |
Check value is an existing file path |
unixPath/isUnixPath |
Check value is Unix Path string. |
winPath/isWinPath |
Check value is Windows Path string. |
isbn10/ISBN10/isISBN10 |
Check value is ISBN10 string. |
isbn13/ISBN13/isISBN13 |
Check value is ISBN13 string. |
Notice:
intX
is contains: int, int8, int16, int32, int64uintX
is contains: uint, uint8, uint16, uint32, uint64floatX
is contains: float32, float64Filters powered by: gookit/filter
filter/aliases | description |
---|---|
int |
Convert value(string/intX/floatX) to int type v.FilterRule("id", "int")
|
uint |
Convert value(string/intX/floatX) to uint type v.FilterRule("id", "uint")
|
int64 |
Convert value(string/intX/floatX) to int64 type v.FilterRule("id", "int64")
|
float |
Convert value(string/intX/floatX) to float type |
bool |
Convert string value to bool. (true : "1", "on", "yes", "true", false : "0", "off", "no", "false") |
trim/trimSpace |
Clean up whitespace characters on both sides of the string |
ltrim/trimLeft |
Clean up whitespace characters on left sides of the string |
rtrim/trimRight |
Clean up whitespace characters on right sides of the string |
int/integer |
Convert value(string/intX/floatX) to int type v.FilterRule("id", "int")
|
lower/lowercase |
Convert string to lowercase |
upper/uppercase |
Convert string to uppercase |
lcFirst/lowerFirst |
Convert the first character of a string to lowercase |
ucFirst/upperFirst |
Convert the first character of a string to uppercase |
ucWord/upperWord |
Convert the first character of each word to uppercase |
camel/camelCase |
Convert string to camel naming style |
snake/snakeCase |
Convert string to snake naming style |
escapeJs/escapeJS |
Escape JS string. |
escapeHtml/escapeHTML |
Escape HTML string. |
str2ints/strToInts |
Convert string to int slice []int
|
str2time/strToTime |
Convert date string to time.Time . |
str2arr/str2array/strToArray |
Convert string to string slice []string
|
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。