使用java实现Public Suffix提取

时间:2011-01-27 17:33:43

标签: java guava domain-name tld

我需要提取网址的顶级域名,我得到了他的http://publicsuffix.org/index.html

并且java实现在http://guava-libraries.googlecode.com中,我找不到 任何提取域名的例子

say example..
example.google.com
returns google.com

and bing.bing.bing.com
returns bing.com

任何人都可以告诉我如何使用这个库实现一个例子......

3 个答案:

答案 0 :(得分:16)

我认为InternetDomainName.topPrivateDomain() 完全你想要什么。 Guava维护一个公共后缀列表(基于mozilla在publicsuffix.org上的列表),用于确定主机的公共后缀部分是什么......顶级私有域是公共后缀加上它的第一个孩子。

这是一个简单的例子:

public class Test {
  public static void main(String[] args) throws URISyntaxException {
    ImmutableList<String> urls = ImmutableList.of(
        "http://example.google.com", "http://google.com", 
        "http://bing.bing.bing.com", "http://www.amazon.co.jp/");
    for (String url : urls) {
      System.out.println(url + " -> " + getTopPrivateDomain(url));
    }
  }

  private static String getTopPrivateDomain(String url) throws URISyntaxException {
    String host = new URI(url).getHost();
    InternetDomainName domainName = InternetDomainName.from(host);
    return domainName.topPrivateDomain().name();
  }
}

运行此代码会打印:

http://example.google.com -> google.com
http://google.com -> google.com
http://bing.bing.bing.com -> bing.com
http://www.amazon.co.jp/ -> amazon.co.jp

答案 1 :(得分:2)

我最近实施了Public Suffix List API

PublicSuffixList suffixList = new PublicSuffixListFactory().build();

assertEquals(
    "google.com", suffixList.getRegistrableDomain("example.google.com"));

assertEquals(
    "bing.com", suffixList.getRegistrableDomain("bing.bing.bing.com"));

assertEquals(
    "amazon.co.jp", suffixList.getRegistrableDomain("www.amazon.co.jp"));

答案 2 :(得分:1)

编辑:对不起,我有点太快了。我没想到co.jp. co.uk,等等。您需要从某个地方获取可能的TLD列表。您还可以查看http://commons.apache.org/validator/来验证顶级域名。

我认为这样的事情应该有效:但也许存在一些Java标准函数。

String url = "http://www.foobar.com/someFolder/index.html";
if (url.contains("://")) {
  url = url.split("://")[1];
}

if (url.contains("/")) {
  url = url.split("/")[0];
}

// You need to get your TLDs from somewhere...
List<String> magicListofTLD = getTLDsFromSomewhere();

int positionOfTLD = -1;
String usedTLD = null;
for (String tld : magicListofTLD) {
  positionOfTLD = url.indexOf(tld);
  if (positionOfTLD > 0) {
    usedTLD = tld;
    break;
  }
}

if (positionOfTLD > 0) {
  url = url.substring(0, positionOfTLD);
} else {
  return;
}
String[] strings = url.split("\\.");

String foo = strings[strings.length - 1] + "." + usedTLD;
System.out.println(foo);