【问题标题】:Extract main domain name from a given url从给定的 url 中提取主域名
【发布时间】:2011-11-05 05:54:50
【问题描述】:

我使用以下方法从 url 中提取域:(它们是测试用例)

String regex = "^(ww[a-zA-Z0-9-]{0,}\\.)";
ArrayList<String> cases = new ArrayList<String>();
cases.add("www.google.com");
cases.add("ww.socialrating.it");
cases.add("www-01.hopperspot.com");
cases.add("wwwsupernatural-brasil.blogspot.com");
cases.add("xtop10.net");
cases.add("zoyanailpolish.blogspot.com");

for (String t : cases) {  
    String res = t.replaceAll(regex, "");  
}

我可以得到以下结果:

google.com
hopperspot.com
socialrating.it
blogspot.com
xtop10.net
zoyanailpolish.blogspot.com

前四个案例都不错。最后一个不好。我想要的是:blogspot.com 最后一个,但它给出了zoyanailpolish.blogspot.com。我做错了什么?

【问题讨论】:

  • 看起来this post 中的正则表达式可能会对您有所帮助 =)
  • 那么不要在你的模式中加入那些愚蠢的 woublewoos。如果您只想s/^[^.]+\.//,那么我建议您这样做。
  • 虽然不清楚你想要什么。您是要删除第一个组件always,还是除 TLD 之前的组件之外的所有组件,还是仅当它以“ww”或 .... 开头时才删除第一个组件?
  • example.com.twexample.co.uk 这样的域怎么样?
  • 那么不要使用硬正则表达式的方式。使用正则表达式来解决这类问题是荒谬的。将点拆分为数组。数零件。检查倒数第二部分是否不是 co 开头(可能还有其他您想要匹配的 ccTLD)。根据结果​​抓住最后两个或三个项目,然后再次将它们连接在一起。

标签: java regex url domain-name


【解决方案1】:

使用 Guava 库,我们可以轻松获取域名:

InternetDomainName.from(tld).topPrivateDomain()

更多详情请参考 API 链接

https://google.github.io/guava/releases/14.0/api/docs/

http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/net/InternetDomainName.html

【讨论】:

    【解决方案2】:

    通过 REGEX 获取主机非常复杂或不可能,因为 TLD 不遵守简单的规则,而是由 ICANN 提供并及时更改。

    您应该使用 JAVA 库提供的功能,如下所示:

    URL myUrl = new URL(urlString);
    myUrl.getHost();
    

    【讨论】:

    • 嗯,是的,但他已经拥有了所有这些。他有时想去掉一些小端主机名的主要元素,尽管他没有告诉我们如何知道这些元素可能是多少。他似乎认为我们可以关注域名并知道我们拥有的部分是否已经是“主要”部分。我认为这是不可能的。
    • 郑重声明,这并不能回答问题。这将返回给定的任何域名,包括子域。 OP 正在寻找没有子域的“根”域名,因此如果给定“www.google.com”,它应该返回“google.com”。此方法返回“www.google.com”。如果您只是尝试从带有路径和/或查询字符串的 URL 获取域,这确实可以很好地工作。
    【解决方案3】:

    这是 2013 年,我找到的解决方案很简单:

    System.out.println(InternetDomainName.fromLenient(uriHost).topPrivateDomain().name());
    

    【讨论】:

      【解决方案4】:

      这要简单得多:

        try {
              String domainName = new URL("http://www.zoyanailpolish.blogspot.com/some/long/link").getHost();
      
              String[] levels = domainName.split("\\.");
              if (levels.length > 1)
              {
                  domainName = levels[levels.length - 2] + "." + levels[levels.length - 1];
              }
      
              // now value of domainName variable is blogspot.com
          } catch (Exception e) {}
      

      【讨论】:

      • 发生了什么:www.zoyanailpolish.blogspot.co.uk
      【解决方案5】:

      正如 BalusC 和其他人所建议的,最实用的解决方案是获取 TLD 列表(参见list),将它们保存到文件中,加载它们,然后确定给定 url 字符串正在使用什么 TLD .从那里开始,您可以按如下方式构成主域名:

          String url = "zoyanailpolish.blogspot.com";
      
          String tld = findTLD( url ); // To be implemented. Add to helper class ?
      
          url = url.replace( "." + tld,"");  
      
          int pos = url.lastIndexOf('.');
      
          String mainDomain = "";
      
          if (pos > 0 && pos < url.length() - 1) {
              mainDomain = url.substring(pos + 1) + "." + tld;
          }
          // else: Main domain name comes out empty
      

      实施细节由您决定。

      【讨论】:

      • 致@James Poulson,谢谢。抱歉,您的示例的输出是什么?我不太明白。它先删除 tld,然后再添加。那么,最终的输出是什么?
      • 没有输出,因为这是伪代码。需要创建一个列出 TLD 的文本文件(TLD 可以在 Wikipedia 链接上找到),需要将这些文件读入数据结构,并且需要填写 findTLD 方法。如果操作正确,它应该可以满足您的需求在这种情况下会给 blogspot.com。
      • 致@James Poulson,对。假设我得到 tld,伪示例将从 url 中删除 .com。然后,它移动到blogspot 之前的点位置。这样就可以去掉zoyanailpolish 了。
      • 就是这个想法:)。如果您在使用它时遇到任何问题,请告诉我。
      • 这可能不再是一个好主意,因为未来几年将有数千个新 TLD 出现。
      【解决方案6】:

      您看到zoyanailpolish.blogspot.com 的原因是您的正则表达式只能找到以'ww' 开头的字符串。您要问的是,除了删除所有以 'ww' 开头的字符串外,它还应该适用于以 'zoyanailpolish' (?) 开头的字符串。在这种情况下,使用正则表达式String regex = "^((ww|z|a)[a-zA-Z0-9-]{0,}\\.)"; 这将删除任何以“ww”或“z”或“a”开头的单词。根据您的确切需求对其进行自定义。

      【讨论】:

      • 对。除了删除所有以“ww”开头的字符串。它也应该适用于与其他人盯着的字符串(不仅仅是'zoyanailpolish')。例如,“xyz.blogspot.com”。
      • 但正如您为xtop10.net 展示的那样,它不会删除xtop10 - 这意味着对于某些字符串它不会删除 - 对吧?问题是 - 它是您不想删除的自定义字符串列表,还是有一个基于此工作的规则?
      • 致@Bhaskar,这取决于。比如xtop10.net,就是一个网站。它是一个域名。我不需要做任何改变。而对于zoyanailpolish.blogspot.com,域名应为blogspot.com。所以,我需要删除zoyanailpolish
      • @chnet 想要什么非常清楚:“对。我想要主域而不是子域”
      • @James 是吗?那么他应该说,现在不应该吗?我希望他能开心地告诉 .com.co.ukpvt.k12.wy.us 都算作同一类事情。
      【解决方案7】:
      InternetDomainName.from("test.blogspot.com").topPrivateDomain() -> test.blogspot.com
      

      这在我的情况下效果更好:

      InternetDomainName.from("test.blogspot.com").topDomainUnderRegistrySuffix() -> blogspot.com
      

      详情: https://github.com/google/guava/wiki/InternetDomainNameExplained

      【讨论】:

        猜你喜欢
        • 2012-03-25
        • 2022-12-06
        • 1970-01-01
        • 2010-10-23
        • 2021-04-12
        • 2011-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多