Извлечь основное доменное имя из данного URL - PullRequest
10 голосов
/ 28 августа 2011

Я использовал следующее для извлечения домена из 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.Что я делаю не так?

Ответы [ 7 ]

11 голосов
/ 15 января 2014

Используя библиотеку 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

7 голосов
/ 28 августа 2011

Получить хост через REGEX довольно сложно или невозможно, потому что TLD не подчиняются простым правилам, а предоставляются ICANN и меняются во времени.

Вместо этого вы должны использовать функциональность, предоставляемую библиотекой JAVA, например:

URL myUrl = new URL(urlString);
myUrl.getHost();
4 голосов
/ 09 ноября 2013

Это 2013 год, и решение, которое я нашел, простое:

System.out.println(InternetDomainName.fromLenient(uriHost).topPrivateDomain().name());
3 голосов
/ 26 декабря 2015

Это намного проще:

  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) {}
2 голосов
/ 28 августа 2011

Как предложено BalusC и другими, наиболее практичным решением было бы получить список TLD (см. Этот список ), сохранить их в файл, загрузить их и затем определить, какой 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

Детали реализации остаются за вами.

1 голос
/ 28 августа 2011

Причина, по которой вы видите zoyanailpolish.blogspot.com, заключается в том, что ваше регулярное выражение находит только строки, которые начинаются с с 'ww'.Вы спрашиваете, что в дополнение к удалению всех строк, начинающихся с 'ww', он также должен работать для строки, начинающейся с 'zoyanailpolish' (?).В этом случае используйте регулярное выражение String regex = "^((ww|z|a)[a-zA-Z0-9-]{0,}\\.)";. Это удалит любое слово, начинающееся с «ww» или «z» или «a».Настройте его в зависимости от того, что вам нужно.

0 голосов
/ 17 мая 2019
InternetDomainName.from("test.blogspot.com").topPrivateDomain() -> test.blogspot.com

В моем случае это работает лучше:

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

Подробности: https://github.com/google/guava/wiki/InternetDomainNameExplained

...