在Go中验证国际域名的最佳方法
在Go中验证国际域名的最佳方法是什么 可能是复制这个不是从网络包导出的函数 我们需要验证像icaan.org和example这样的域。(特殊字符) 编辑:IDN 已经在使用govalidator,它无法验证IDN,因为它不处理unicode字符 下面是一些IDN的例子在Go中验证国际域名的最佳方法,go,Go,在Go中验证国际域名的最佳方法是什么 可能是复制这个不是从网络包导出的函数 我们需要验证像icaan.org和example这样的域。(特殊字符) 编辑:IDN 已经在使用govalidator,它无法验证IDN,因为它不处理unicode字符 下面是一些IDN的例子 -阿拉伯语 -中文(简体) -中文(繁体) -希腊语 ाहरण.परीक्षा 印地语 -日语 -韩语 -波斯语 -俄语 刚刚看到对punycode的引用 虽然所有这些punycode都在公共后缀列表中 :(一种可能的方
- -阿拉伯语
- -中文(简体)
- -中文(繁体)
- -希腊语
- ाहरण.परीक्षा 印地语
- -日语
- -韩语
- -波斯语
- -俄语
:(一种可能的方法是使用内置函数和正则表达式来匹配由点分隔的Unicode字母/数字/标记序列(如示例数据集中所示) 例如:
var domainNamePattern = regexp.MustCompile(`^([\p{L}\p{M}\p{N}_%+-]+\.)+[\p{L}\p{M}\p{N}]+$`)
func main() {
ss := []string{
`https://evertpot.com/internationalized-domain-names-are-you-ready/`,
`http://bogus!.com`,
`https://foo1.bar2.com.gah.zip/`,
`http://مثال.إختبار`,
`http://例子.测试`,
`http://例子.測試`,
`http://παράδειγμα.δοκιμή`,
`http://उदाहरण.परीक्षा`,
`http://例え.テスト`,
`http://실례.테스트`,
`http://مثال.آزمایشی`,
`http://пример.испытание`,
}
for _, s := range ss {
u, err := url.Parse(s)
if err != nil || !domainNamePattern.MatchString(u.Hostname()) {
bogusPart := s
if err == nil {
bogusPart = u.Hostname()
}
fmt.Printf("ERROR: invalid URL or hostname %q\n", bogusPart)
continue
}
fmt.Printf("OK: hostname=%q\n", u.Hostname())
}
}
// OK: hostname="evertpot.com"
// ERROR: invalid URL or hostname "bogus!.com"
// OK: hostname="foo1.bar2.com.gah.zip"
// OK: hostname="مثال.إختبار"
// OK: hostname="例子.测试"
// OK: hostname="例子.測試"
// OK: hostname="παράδειγμα.δοκιμή"
// OK: hostname="उदाहरण.परीक्षा"
// OK: hostname="例え.テスト"
// OK: hostname="실례.테스트"
// OK: hostname="مثال.آزمایشی"
// OK: hostname="пример.испытание"
当然,应该更加小心地构建正则表达式,使其符合任何相关规范,但这个示例应该是一个很好的起点。什么是“验证国际域名”?您只是想知道它的格式是否正确,或者它是否存在于DNS中?格式是否正确,没有非法字符或只是行话。IDN>您必须将其转换为govalidator的punycode。