从给定的URL中提取主域名

时间:2011-08-27 20:49:54

标签: java regex url domain-name

我使用以下方法从网址中提取域名:(他们是测试用例)

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。我做错了什么?

7 个答案:

答案 0 :(得分:11)

使用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

答案 1 :(得分:7)

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

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

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

答案 2 :(得分:4)

这是2013年,我发现解决方案是直截了当的:

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

答案 3 :(得分:2)

正如BalusC和其他人所建议的那样,最实际的解决方案是获取TLD列表(请参阅此list),将它们保存到文件中,加载它们然后确定给定的TLD使用url字符串。从那以后,您可以构成主域名,如下所示:

    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

实施细节由您决定。

答案 4 :(得分:2)

更简单:

  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) {}

答案 5 :(得分:1)

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

答案 6 :(得分:0)

firebase.auth().onAuthStateChanged(function(user) {
    if (user) {

      var user = firebase.auth().currentUser;


      if(user != null){ 
        var io=user.uid;
        window.alert("success "+io);




      }

    } else {
      // No user is signed in.
      Window.reload();

    }
  });

这对我来说效果更好:

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

详细信息: https://github.com/google/guava/wiki/InternetDomainNameExplained