diff --git a/README.md b/README.md index 6c7bd29..c08b2c8 100644 --- a/README.md +++ b/README.md @@ -2309,7 +2309,7 @@ import "github.com/duke-git/lancet/v2/validator" [[play](https://go.dev/play/p/jlYApVLLGTZ)] - **IsEmail** : check if the string is a email address. [[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/validator.md#IsEmail)] - [[play](https://go.dev/play/p/Os9VaFlT33G)] + [[play](https://go.dev/play/p/HVQ5LAe-vFz)] - **IsEmptyString** : check if the string is empty. [[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/validator.md#IsEmptyString)] [[play](https://go.dev/play/p/dpzgUjFnBCX)] diff --git a/README_zh-CN.md b/README_zh-CN.md index e50b18b..fff699e 100644 --- a/README_zh-CN.md +++ b/README_zh-CN.md @@ -2316,7 +2316,7 @@ import "github.com/duke-git/lancet/v2/validator" [[play](https://go.dev/play/p/jlYApVLLGTZ)] - **IsEmail** : 验证字符串是否是有效电子邮件地址。 [[doc](https://github.com/duke-git/lancet/blob/main/docs/api/packages/validator.md#IsEmail)] - [[play](https://go.dev/play/p/Os9VaFlT33G)] + [[play](https://go.dev/play/p/HVQ5LAe-vFz)] - **IsEmptyString** : 验证字符串是否是空字符串。 [[doc](https://github.com/duke-git/lancet/blob/main/docs/api/packages/validator.md#IsEmptyString)] [[play](https://go.dev/play/p/dpzgUjFnBCX)] diff --git a/docs/api/packages/validator.md b/docs/api/packages/validator.md index 222821f..8dd194d 100644 --- a/docs/api/packages/validator.md +++ b/docs/api/packages/validator.md @@ -549,7 +549,7 @@ func main() { func IsEmail(email string) bool ``` -示例:[运行](https://go.dev/play/p/Os9VaFlT33G) +示例:[运行](https://go.dev/play/p/HVQ5LAe-vFz) ```go import ( @@ -559,13 +559,28 @@ import ( func main() { result1 := validator.IsEmail("abc@xyz.com") - result2 := validator.IsEmail("a.b@@com") + result2 := validator.IsEmail("user@domain.co") + result3 := validator.IsEmail("test.user@example.org") + result4 := validator.IsEmail("@abc@xyz.com") + result5 := validator.IsEmail("a.b@@com") + result6 := validator.IsEmail("a.b@com") + result7 := validator.IsEmail("test@example") fmt.Println(result1) fmt.Println(result2) + fmt.Println(result3) + fmt.Println(result4) + fmt.Println(result5) + fmt.Println(result6) + fmt.Println(result7) // Output: // true + // true + // true + // false + // false + // false // false } ``` diff --git a/docs/en/api/packages/validator.md b/docs/en/api/packages/validator.md index e811d8c..05b2255 100644 --- a/docs/en/api/packages/validator.md +++ b/docs/en/api/packages/validator.md @@ -551,7 +551,7 @@ func main() { func IsEmail(email string) bool ``` -Example:[Run](https://go.dev/play/p/Os9VaFlT33G) +Example:[Run](https://go.dev/play/p/HVQ5LAe-vFz) ```go import ( @@ -561,13 +561,28 @@ import ( func main() { result1 := validator.IsEmail("abc@xyz.com") - result2 := validator.IsEmail("a.b@@com") + result2 := validator.IsEmail("user@domain.co") + result3 := validator.IsEmail("test.user@example.org") + result4 := validator.IsEmail("@abc@xyz.com") + result5 := validator.IsEmail("a.b@@com") + result6 := validator.IsEmail("a.b@com") + result7 := validator.IsEmail("test@example") fmt.Println(result1) fmt.Println(result2) + fmt.Println(result3) + fmt.Println(result4) + fmt.Println(result5) + fmt.Println(result6) + fmt.Println(result7) // Output: // true + // true + // true + // false + // false + // false // false } ``` diff --git a/validator/validator.go b/validator/validator.go index 18f8825..e72bdee 100644 --- a/validator/validator.go +++ b/validator/validator.go @@ -8,7 +8,6 @@ import ( "encoding/json" "fmt" "net" - "net/mail" "net/url" "reflect" "regexp" @@ -26,6 +25,7 @@ var ( intStrMatcher *regexp.Regexp = regexp.MustCompile(`^[\+-]?\d+$`) // dnsMatcher *regexp.Regexp = regexp.MustCompile(`^(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}$`) dnsMatcher *regexp.Regexp = regexp.MustCompile(`^(?:[a-zA-Z0-9](?:[a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)*(?:xn--[a-zA-Z0-9\-]{1,59}|[a-zA-Z0-9](?:[a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?)$`) + emailMatcher *regexp.Regexp = regexp.MustCompile(`^[a-z0-9._%+\-]+@[a-z0-9.\-]+\.[a-z]{2,}$`) chineseMobileMatcher *regexp.Regexp = regexp.MustCompile(`^1(?:3\d|4[4-9]|5[0-35-9]|6[67]|7[013-8]|8\d|9\d)\d{8}$`) chineseIdMatcher *regexp.Regexp = regexp.MustCompile(`([1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx])|([1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}[0-9Xx])`) chineseMatcher *regexp.Regexp = regexp.MustCompile("[\u4e00-\u9fa5]") @@ -321,10 +321,9 @@ func IsDns(dns string) bool { } // IsEmail check if the string is a email address. -// Play: https://go.dev/play/p/Os9VaFlT33G +// Play: https://go.dev/play/p/HVQ5LAe-vFz func IsEmail(email string) bool { - _, err := mail.ParseAddress(email) - return err == nil + return emailMatcher.MatchString(strings.ToLower(email)) } // IsChineseMobile check if the string is chinese mobile number. diff --git a/validator/validator_test.go b/validator/validator_test.go index 3adcd72..af78004 100644 --- a/validator/validator_test.go +++ b/validator/validator_test.go @@ -494,8 +494,12 @@ func TestIsEmail(t *testing.T) { assert := internal.NewAssert(t, "TestIsEmail") assert.Equal(true, IsEmail("abc@xyz.com")) + assert.Equal(true, IsEmail("user@domain.co")) + assert.Equal(true, IsEmail("test.user@example.org")) assert.Equal(false, IsEmail("@abc@xyz.com")) assert.Equal(false, IsEmail("a.b@@com")) + assert.Equal(false, IsEmail("a.b@com")) + assert.Equal(false, IsEmail("test@example")) } func TestContainChinese(t *testing.T) {