Учитывая URL-адрес, я хочу извлечь доменное имя (оно не должно включать часть www). URL может содержать http / https. Вот написанный мной код Java. Хотя кажется, что он работает нормально, есть ли лучший подход или есть какие-то крайние случаи, которые могут потерпеть неудачу.
public static String getDomainName(String url) throws MalformedURLException{
if(!url.startsWith("http") && !url.startsWith("https")){
url = "http://" + url;
}
URL netUrl = new URL(url);
String host = netUrl.getHost();
if(host.startsWith("www")){
host = host.substring("www".length()+1);
}
return host;
}
Ввод: http://google.com/blah
Вывод: google.com
http://74.125.226.70
и дай мне знать, как это работает :)http://www.de/
илиhttp://www.com/
не даст желаемых результатов.Ответы:
Если вы хотите проанализировать URL-адрес, используйте
java.net.URI
.java.net.URL
имеет множество проблем - егоequals
метод выполняет поиск в DNS, что означает, что код, использующий его, может быть уязвим для атак отказа в обслуживании при использовании с ненадежными входными данными.«Мистер Гослинг, почему вы сделали url отстой?» объясняет одну из таких проблем. Просто возьмите за привычку использовать
java.net.URI
вместо этого.должен делать то, что хочешь.
Ваш код в том виде, в каком он написан, не работает для действительных URL-адресов:
httpfoo/bar
- относительный URL с компонентом пути, который начинается сhttp
.HTTP://example.com/
- протокол нечувствителен к регистру.//example.com/
- относительный URL протокола с хостомwww/foo
- относительный URL-адрес с компонентом пути, который начинается сwww
wwwexample.com
- доменное имя, которое не начинается с,www.
а начинается сwww
.Иерархические URL-адреса имеют сложную грамматику. Если вы попытаетесь развернуть свой собственный синтаксический анализатор, не внимательно прочитав RFC 3986, вы, вероятно, ошибетесь. Просто используйте тот, который встроен в основные библиотеки.
Если вам действительно нужно иметь дело с беспорядочными вводами, которые
java.net.URI
отклоняются, см. RFC 3986 Приложение B:источник
www.google.com
- это относительный URL-адрес с компонентом путиwww.google.com
. Например, еслиhttp://example.com/
принять решение против , вы получитеhttp://example.com/www.google.com
.Читать далее
источник
Вот короткая и простая строка, используемая
InternetDomainName.topPrivateDomain()
в Guava:InternetDomainName.from(new URL(url).getHost()).topPrivateDomain().toString()
Учитывая
http://www.google.com/blah
, что вам дастgoogle.com
. Или, учитываяhttp://www.google.co.mx
, это даст вамgoogle.co.mx
.Как прокомментировал Са Када в другом ответе на этот пост , этот вопрос задавался ранее: Извлечь основное доменное имя из заданного URL-адреса . Лучший ответ на этот вопрос от Satya , который наводит на мысль гуавы в InternetDomainName.topPrivateDomain ()
Собирая это вместе с тем
URL.getHost()
, что уже содержится в исходном посте, вы получаете:источник
Я написал метод (см. Ниже), который извлекает имя домена URL и использует простое сопоставление строк. На самом деле он извлекает бит между первым
"://"
(или индексом,0
если его нет"://"
) и первым последующим"/"
(или индексом,String.length()
если последующего нет"/"
). Оставшийся предшествующий"www(_)*."
бит обрезается. Я уверен, что будут случаи, когда этого будет недостаточно, но в большинстве случаев этого должно хватить!В сообщении Майка Самуэля выше говорится, что
java.net.URI
класс мог это сделать (и был предпочтительнееjava.net.URL
класса), но я столкнулся с проблемами сURI
классом. В частности,URI.getHost()
дает нулевое значение, если URL-адрес не включает схему, то есть"http(s)"
бит.источник
http://bob.com:8080/service/read?name=robert
Я сделал небольшую обработку после создания объекта URI
источник
В моем случае мне нужен был только основной домен, а не субдомен (без www или другого субдомена):
С помощью этого метода URL-адрес https://rest.webtoapp.io/llSlider?lg=en&t=8 будет иметь для домена «webtoapp.io».
источник
попробуйте это: java.net.URL;
JOptionPane.showMessageDialog (null, getDomainName (новый URL-адрес (« https://en.wikipedia.org/wiki/List_of_Internet_top-level_domains »)));
источник
Есть аналогичный вопрос. Извлечь основное доменное имя из заданного URL-адреса . Если вы посмотрите на этот ответ , вы увидите, что это очень просто. Вам просто нужно использовать
java.net.URL
иString
утилиту -Split
источник
Объяснение: Регулярное выражение состоит из 4 групп. Первые две - несовпадающие группы, а следующие две - совпадающие.
Первая неподходящая группа - это «http», «https» или «»
Вторая неподходящая группа - «www». или ""
Вторая подходящая группа - это домен верхнего уровня.
Первая подходящая группа - это все, что находится после несовпадающих групп, и все, что находится перед доменом верхнего уровня.
Объединение двух совпадающих групп даст нам имя домена / хоста.
PS: обратите внимание, что вы можете добавить любое количество поддерживаемых доменов в регулярное выражение.
источник
Если входной URL-адрес введен пользователем. этот метод дает наиболее подходящее имя хоста. если не найден, возвращает входной URL.
источник
Все вышеперечисленное хорошо. Мне это кажется очень простым и легким для понимания. Извините за цитаты. Я написал его для Groovy внутри класса DataCenter.
А вот несколько тестов junit4:
источник
Один из способов, которыми я работал и работал для всех случаев, - это использование библиотеки Guava и регулярного выражения в сочетании.
getDomain () может быть любым обычным методом с регулярным выражением.
источник
Чтобы получить фактическое доменное имя без поддомена, я использую:
Обратите внимание, что это не будет работать с доменами второго уровня (например, .co.uk).
источник