isValidDomain 验证域名格式是否有效
(domain string)
| 47 | |
| 48 | // isValidDomain 验证域名格式是否有效 |
| 49 | func isValidDomain(domain string) bool { |
| 50 | // 基本长度检查 |
| 51 | if len(domain) == 0 || len(domain) > 253 { |
| 52 | return false |
| 53 | } |
| 54 | |
| 55 | // 检查是否包含非法字符 |
| 56 | if strings.ContainsAny(domain, " \t\n\r") { |
| 57 | return false |
| 58 | } |
| 59 | |
| 60 | // 检查是否以点开头或结尾 |
| 61 | if strings.HasPrefix(domain, ".") || strings.HasSuffix(domain, ".") { |
| 62 | return false |
| 63 | } |
| 64 | |
| 65 | // 检查是否包含连续的点 |
| 66 | if strings.Contains(domain, "..") { |
| 67 | return false |
| 68 | } |
| 69 | |
| 70 | // 使用正则表达式验证域名格式 |
| 71 | domainRegex := regexp.MustCompile(`^[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?)*$`) |
| 72 | if !domainRegex.MatchString(domain) { |
| 73 | return false |
| 74 | } |
| 75 | |
| 76 | // 尝试解析域名(不进行实际DNS查询) |
| 77 | _, err := net.LookupHost(domain) |
| 78 | if err != nil { |
| 79 | // 即使DNS解析失败,只要格式正确就认为是有效的 |
| 80 | // 因为可能是网络问题或域名确实不存在 |
| 81 | return true |
| 82 | } |
| 83 | |
| 84 | return true |
| 85 | } |
no outgoing calls
no test coverage detected