从给定的 url 中提取主域名

Posted

技术标签:

【中文标题】从给定的 url 中提取主域名【英文标题】:Extract main domain name from a given 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)。根据结果​​抓住最后两个或三个项目,然后再次将它们连接在一起。 【参考方案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

【讨论】:

以上是关于从给定的 url 中提取主域名的主要内容,如果未能解决你的问题,请参考以下文章

如何从 URL 中提取***域名 (TLD)

Python获取url中域名及从域名中提取ip的方法

csharp 从URL中提取域名

从主机名中提取域名

在 Python 中从 URL 中提取域名

从给定的字符串中提取 url [重复]