2025-03-21 11:05:42 +08:00

79 lines
2.4 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.

package validation
import (
"errors"
"regexp"
)
// 使用预编译的全局正则表达式,避免重复创建和编译.
var (
lengthRegex = regexp.MustCompile(`^.{3,20}$`) // 长度在 3 到 20 个字符之间
validRegex = regexp.MustCompile(`^[A-Za-z0-9_]+$`) // 仅包含字母、数字和下划线
letterRegex = regexp.MustCompile(`[A-Za-z]`) // 至少包含一个字母
numberRegex = regexp.MustCompile(`\d`) // 至少包含一个数字
emailRegex = regexp.MustCompile(`^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`) // 邮箱格式
phoneRegex = regexp.MustCompile(`^1[3-9]\d{9}$`) // 中国手机号
)
// IsValidUsername 校验用户名是否合法.
func IsValidUsername(username string) bool {
// 校验长度
if !lengthRegex.MatchString(username) {
return false
}
// 校验字符合法性
if !validRegex.MatchString(username) {
return false
}
return true
}
// IsValidPassword 判断密码是否符合复杂度要求.
func IsValidPassword(password string) error {
switch {
// 检查新密码是否为空
case password == "":
return errors.New("password cannot be empty")
// 检查新密码的长度要求
case len(password) < 6:
return errors.New("password must be at least 6 characters long")
// 使用正则表达式检查是否至少包含一个字母
case !letterRegex.MatchString(password):
return errors.New("password must contain at least one letter")
// 使用正则表达式检查是否至少包含一个数字
case !numberRegex.MatchString(password):
return errors.New("password must contain at least one number")
}
return nil
}
// IsValidEmail 判断电子邮件是否合法.
func IsValidEmail(email string) error {
// 检查电子邮件地址格式
if email == "" {
return errors.New("email cannot be empty")
}
// 使用正则表达式校验电子邮件格式
if !emailRegex.MatchString(email) {
return errors.New("invalid email format")
}
return nil
}
// IsValidPhone 判断手机号码是否合法.
func IsValidPhone(phone string) error {
// 检查手机号码格式
if phone == "" {
return errors.New("phone cannot be empty")
}
// 使用正则表达式校验手机号码格式假设是中国手机号11位数字
if !phoneRegex.MatchString(phone) {
return errors.New("invalid phone format")
}
return nil
}