今天在遇到一个需求,有很多的ip和域名,要求统一转成ip
- 如下图:
- 那的思路是先讲ip和域名分割出来,然后循环判断哪些是域名,当然这里必不可少离不开正则表达式了。 上代码。
代码如下
func ParseDomainIp(domain string) ([]net.IP, error) {
// 正则表达式模式
pattern1 := `^(?:(?:https?://)?(?:www\.)?)?([a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}$`
pattern2 := `^(?:https?://)?(?:www\.)?([a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.[a-zA-Z]{2,})$`
// 编译正则表达式
reg1 := regexp.MustCompile(pattern1)
// 匹配
if reg1.MatchString(domain) {
reg2 := regexp.MustCompile(pattern2)
match2 := reg2.FindStringSubmatch(domain)
if match2 != nil {
// 获取捕获组中的域名部分
capturedDomain := match2[1]
//将域名解析为ip
ips, err := net.LookupIP(capturedDomain)
if err != nil {
return nil, errors.New("解析域名为Ip失败:" + err.Error())
}
return ips, nil
} else {
fmt.Println("正则匹配出域名失败,您提供很可能不是一个完整的域名")
}
} else {
return nil, errors.New("并不是域名")
}
return nil, nil
}
最后调用
func main() {
domain := "https://grpc.vip"
ips, err := ParseDomainIp(domain)
if err != nil {
fmt.Println("结果:", err.Error())
return
}
for _, ip := range ips {
fmt.Println("IP:", ip)
}
}
结果如下图: