@@ -100,6 +100,8 @@ var (
100
100
IPv6 = validation .NewStringRule (govalidator .IsIPv6 , "must be a valid IPv6 address" )
101
101
// Subdomain validates if a string is valid subdomain
102
102
Subdomain = validation .NewStringRule (isSubdomain , "must be a valid subdomain" )
103
+ // Domain validates if a string is valid domain
104
+ Domain = validation .NewStringRule (isDomain , "must be a valid domain" )
103
105
// DNSName validates if a string is valid DNS name
104
106
DNSName = validation .NewStringRule (govalidator .IsDNSName , "must be a valid DNS name" )
105
107
// Host validates if a string is a valid IP (both v4 and v6) or a valid DNS name
@@ -133,9 +135,24 @@ func isDigit(value string) bool {
133
135
}
134
136
135
137
func isSubdomain (value string ) bool {
138
+ // Subdomain regex source: https://stackoverflow.com/a/7933253
139
+ reSubdomain := regexp .MustCompile (`^[A-Za-z0-9](?:[A-Za-z0-9\-]{0,61}[A-Za-z0-9])?$` )
136
140
return reSubdomain .MatchString (value )
137
141
}
138
142
143
+ func isDomain (value string ) bool {
144
+ if len (value ) > 255 {
145
+ return false
146
+ }
147
+
148
+ // Domain regex source: https://stackoverflow.com/a/7933253
149
+ // Slightly modified: Removed 255 max length validation since Go regex does not
150
+ // support lookarounds. More info: https://stackoverflow.com/a/38935027
151
+ reDomain := regexp .MustCompile (`^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+(?:[a-z]{1,63}| xn--[a-z0-9]{1,59})$` )
152
+
153
+ return reDomain .MatchString (value )
154
+ }
155
+
139
156
func isUTFNumeric (value string ) bool {
140
157
for _ , c := range value {
141
158
if unicode .IsNumber (c ) == false {
0 commit comments