Извлечь основное доменное имя из заданного URL-адреса
Я использовал следующее для извлечения домена из 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
. Что я делаю неправильно?
Ответы
Ответ 1
Как было предложено 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
Сведения о реализации остаются за вами.
Ответ 2
Используя библиотеку 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
Ответ 3
Получить хост через REGEX довольно сложно или невозможно, потому что TLD не подчиняются простым правилам, но предоставляются ICANN и изменяются во времени.
Вместо этого вы должны использовать функциональность, предоставляемую библиотекой JAVA следующим образом:
URL myUrl = new URL(urlString);
myUrl.getHost();
Ответ 4
Это 2013 год и решение, которое я нашел, прямолинейно:
System.out.println(InternetDomainName.fromLenient(uriHost).topPrivateDomain().name());
Ответ 5
Это намного проще:
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) {}
Ответ 6
Причина, по которой вы видите zoyanailpolish.blogspot.com
, заключается в том, что ваше регулярное выражение находит только строки, начинающиеся с символа 'ww'. Что вы спрашиваете, так это то, что помимо удаления всех строк, начинающихся с "ww", он также должен работать для строки, начинающейся с "zoyanailpolish" (?). В этом случае используйте регулярное выражение String regex = "^((ww|z|a)[a-zA-Z0-9-]{0,}\\.)";
Это приведет к удалению любого слова, которое начинается с "ww" или "z" или "a". Настройте его на основе того, что вам нужно.
Ответ 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