gpt4 book ai didi

go - 在 Go 中验证国际域名的最佳方法

转载 作者:数据小太阳 更新时间:2023-10-29 03:22:24 24 4
gpt4 key购买 nike

在 Go 中验证国际域名的最佳方法是什么?

https://golang.org/pkg/net/?m=all#isDomainName

https://golang.org/src/net/dnsclient.go?s=3444:3476#L109

也许复制这个不是从 net 包中导出的函数?

我们需要验证 icaan.org 和 example.(特殊字符)等域

编辑:IDN https://en.wikipedia.org/wiki/Internationalized_domain_name

已经在使用无法验证 IDN 的 govalidator,因为它不处理 unicode 字符 https://github.com/asaskevich/govalidator/blob/master/validator.go

这里有一些国际化域名的例子

刚刚看到对 punycode 的引用。

尽管所有这些 punycode 都在公共(public)后缀列表中 https://publicsuffix.org/list/public_suffix_list.dat

:(

最佳答案

一种可能的方法是使用内置函数 url.Parse(string)url.Hostname()以及用于匹配由点分隔的 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="пример.испытание"

当然,构建正则表达式时应格外小心,使其符合任何相关规范,但这个示例应该是一个很好的起点。

关于go - 在 Go 中验证国际域名的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51515962/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com