首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Go中验证国际域名的最佳方法

Go中验证国际域名的最佳方法
EN

Stack Overflow用户
提问于 2018-07-25 09:53:56
回答 1查看 1.4K关注 0票数 0

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

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

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

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

我们需要验证域,如icaan.org和示例。(特殊字符)

编辑: IDN name

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

以下是IDN的一些例子

  • https://evertpot.com/internationalized-domain-names-are-you-ready/
  • http://مثال.إختبار -阿拉伯语。
  • http://例子.测试 -中文(简体)
  • http://例子.測試 -中文(繁体)
  • http://παράδειγμα.δοκιμή -希腊语
  • http://उदाहरण.परीक्षा印地语
  • http://例え.テスト -日语
  • http://실례.테스트 -韩语
  • http://مثال.آزمایشی -波斯语
  • http://пример.испытание -俄语

刚刚看到了对小代码的引用。

尽管所有这些小代码都在公共后缀列表中,但list.dat

:(

EN

回答 1

Stack Overflow用户

发布于 2018-07-27 16:48:44

一种可能的方法是使用内置函数url.Parse(string)url.Hostname()以及正则表达式来匹配由点分隔的Unicode字母/数字/标记序列(如示例数据集中所示)。

例如:

代码语言:javascript
复制
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="пример.испытание"

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51515962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档