从给定的 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.tw
和 example.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.uk
和 pvt.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 中提取主域名的主要内容,如果未能解决你的问题,请参考以下文章