【问题标题】:What is best way to normalize an URI to extract just the domain name?规范化 URI 以仅提取域名的最佳方法是什么?
【发布时间】:2012-07-06 13:48:07
【问题描述】:

例如:

http://www.google.co.uk
www.google.co.uk
google.co.uk

将全部转换为:

google.co.uk

我本来希望使用 System.Uri 类,但这似乎只接受带有方案的 url。

【问题讨论】:

  • 然后添加一个方案,如果还没有的话。
  • 那么添加方案,然后将其归一化?

标签: c# .net uri


【解决方案1】:

提取域名很容易

UriBuilder class 规范化 URL 并处理许多边缘情况,例如缺少方案。这使得提取域名变得容易。比如这些都给你www.google.co.uk

new UriBuilder("www.google.co.uk").Host
new UriBuilder("http://www.google.co.uk").Host
new UriBuilder("ftp://www.google.co.uk:21/some/path").Host

...但是删除www. 很难

这个问题看起来很简单,但事实并非如此。您无法可靠地删除像 www 这样的子域,因为没有真正的区别。域 www.google.co.uk,包括wwwco.uk 没有什么特别之处,它使 google 成为域的一部分,而 www 不是它的一部分——恰好co.uk 由注册商管理,google.co.uk 由 Google 管理。

为了让您了解这个问题,这里有一个incomplete list of domain suffixes,到目前为止包含近 7100 个条目。值得注意的是,哪个部分甚至不一致:

URL你想要的域 --------------------------------- ----- http://www.crews.aero 船员.aero http://www.crew.aero www.crew.aero

最好的方法是what Google itself does for Chrome's omnibar:获取(incomplete) list of domain suffixes,临时缓存它,然后将域名与域后缀列表进行比较。您可以自己查看结果:在 Chrome 多功能栏中输入“crews.aero”,它将被视为 URL,或输入“crew.aero”,它将被视为搜索。

【讨论】:

    【解决方案2】:

    试试这段代码

    var url = "";
    if (! url.Contains("://"))
    {
            Url = "http://" + url;
    }
    
    var result = new Uri(url).Host;
    

    【讨论】:

    • 我想确保 www.google.com 和 google.com 也被视为相同。这是为了防止重复的网站条目进入我的系统。正在替换 www。空字符串足够健壮吗?
    猜你喜欢
    • 1970-01-01
    • 2013-09-30
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多