diff --git a/internal/tools/ipparser.go b/internal/tools/ipparser.go index 296b32c..602ffd2 100644 --- a/internal/tools/ipparser.go +++ b/internal/tools/ipparser.go @@ -6,29 +6,51 @@ import ( ) var ( - ipv4re0 *regexp.Regexp - ipv4re *regexp.Regexp + ipv4re *regexp.Regexp ipv6re0 *regexp.Regexp ipv6re *regexp.Regexp ) func init() { - ipv4re0 = regexp.MustCompile(`^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$`) ipv4re = regexp.MustCompile(`(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}`) ipv6re0 = regexp.MustCompile(`^fe80:(:[0-9a-fA-F]{1,4}){0,4}(%\w+)?|([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|(([0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4})?::(([0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4})?$`) ipv6re = regexp.MustCompile(`fe80:(:[0-9a-fA-F]{1,4}){0,4}(%\w+)?|([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|(([0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4})?::(([0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4})?`) } -func ValidIP4(str string) bool { - str = strings.Trim(str, " ") - return ipv4re0.MatchString(str) +func ValidIP4(IP string) bool { + arr := strings.Split(IP, ".") + if len(arr) != 4 { + return false + } + for _, elem := range arr { + if elem == "" { + return false + } + if len(elem) > 1 && elem[0] == '0' { + return false + } + num := 0 + for _, c := range elem { + if c >= '0' && c <= '9' { + num = num*10 + int(c-'0') + } else { + return false + } + } + if num > 255 { + return false + } + } + return true } func ValidIP6(str string) bool { str = strings.Trim(str, " ") return ipv6re0.MatchString(str) + + //return isIPV6(str) } func GetIP4FromString(str string) []string { @@ -40,3 +62,29 @@ func GetIP6FromString(str string) []string { str = strings.Trim(str, " ") return ipv6re.FindAllString(str, -1) } + +//IPV6地址的判断: +//1. 用“:”分割字符串,若长度不等于8,则return Neither +//2. 遍历每一个数组的每一个元素,若元素的长度大于4,则return Neither +//3. 判断每一个元素的字符,若出现非0-9,A-F的字符,则return Neither +func isIPV6(IP string) bool { + IP = strings.ToUpper(IP) + arr := strings.Split(IP, ":") + if len(arr) != 8 { + return false + } + for _, elem := range arr { + if elem == "" || len(elem) > 4 { + return false + } + + for _, c := range elem { + if (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') { + continue + } else { + return false + } + } + } + return true +} diff --git a/internal/tools/iptools_test.go b/internal/tools/iptools_test.go index b00aa47..d6fc8af 100644 --- a/internal/tools/iptools_test.go +++ b/internal/tools/iptools_test.go @@ -10,3 +10,59 @@ func TestIP4Re(t *testing.T) { fmt.Println(GetIP4FromString(str)) fmt.Println(ValidIP4(str)) } + +func TestValidIP6(t *testing.T) { + ipv6Valid := []string{ + "1:2:3:4:5:6:7::", + "1:2:3:4:5:6:7:8", + + "1:2:3:4:5:6::", + "1:2:3:4:5:6::8", + + "1:2:3:4:5::", + "1:2:3:4:5::8", + + "1:2:3:4::", + "1:2:3:4::8", + + "1:2:3::", + "1:2:3::8", + + "1:2::", + "1:2::8", + + "1::", + "1::8", + + "::", + "::8", + "::7:8", + "::6:7:8", + "::5:6:7:8", + "::4:5:6:7:8", + "::3:4:5:6:7:8", + "::2:3:4:5:6:7:8", + + "::192.168.1.1", + "::ffff:135.75.43.52", + "A:0f:0F:FFFF:5:6:7:8", + } + + ipv6Invalid := []string{ + "A:0f:0F:FFFF1:5:6:7:8", + "G:0f:0F:FFFF:5:6:7:8", + "2001::25de::cade", + } + + for _, i := range ipv6Valid { + if !ValidIP6(i) { + t.Log("valid:", i) + } + } + + for _, i := range ipv6Invalid { + if ValidIP6(i) { + t.Log("invalid:", i) + } + } +}