diff --git a/common/parsers/parse_test.go b/common/parsers/parse_test.go index 4a44d7b..7bcb66c 100644 --- a/common/parsers/parse_test.go +++ b/common/parsers/parse_test.go @@ -444,6 +444,16 @@ func TestParseIP_SingleIP(t *testing.T) { "example.com", []string{"example.com"}, }, + { + "带横杠的域名", + "111-555.sss.com", + []string{"111-555.sss.com"}, + }, + { + "多段横杠域名", + "my-test-server.example.com", + []string{"my-test-server.example.com"}, + }, } for _, tt := range tests { diff --git a/common/parsers/parsers.go b/common/parsers/parsers.go index 537144b..eecb1cf 100644 --- a/common/parsers/parsers.go +++ b/common/parsers/parsers.go @@ -112,7 +112,7 @@ func parseHostString(host string) ([]string, error) { return nil, fmt.Errorf("CIDR解析失败 %s: %w", h, err) } hosts = append(hosts, cidrHosts...) - case strings.Contains(h, "-") && !strings.Contains(h, ":"): + case strings.Contains(h, "-") && !strings.Contains(h, ":") && looksLikeIPRange(h): rangeHosts, err := parseIPRangeString(h, SimpleMaxHosts) if err != nil { return nil, fmt.Errorf("IP范围解析失败 %s: %w", h, err) @@ -316,6 +316,19 @@ func parseIPCIDR(cidr string, maxTargets int) ([]string, error) { return ips, nil } +// looksLikeIPRange 检查字符串是否像IP范围格式 +// 如 192.168.1.1-100 或 192.168.1.1-192.168.1.100 +// 而不是像 111-555.sss.com 这种域名 +func looksLikeIPRange(s string) bool { + idx := strings.Index(s, "-") + if idx == -1 { + return false + } + // 检查 - 前面的部分是否是有效IP + startPart := s[:idx] + return net.ParseIP(startPart) != nil +} + // parseIPRangeString 解析IP范围字符串 func parseIPRangeString(rangeStr string, maxTargets int) ([]string, error) { parts := strings.Split(rangeStr, "-")