Если вы хотите проанализировать URL-адрес, используйте java.net.URI
. java.net.URL
имеет множество проблем - его equals
метод выполняет поиск в DNS, что означает, что код, использующий его, может быть уязвим для атак отказа в обслуживании при использовании с ненадежными входными данными.
«Мистер Гослинг, почему вы сделали url отстой?» объясняет одну из таких проблем. Просто возьмите за привычку использовать java.net.URI
вместо этого.
public static String getDomainName(String url) throws URISyntaxException {
URI uri = new URI(url);
String domain = uri.getHost();
return domain.startsWith("www.") ? domain.substring(4) : domain;
}
должен делать то, что хочешь.
Хотя кажется, что он работает нормально, есть ли лучший подход или есть какие-то крайние случаи, которые могут потерпеть неудачу.
Ваш код в том виде, в каком он написан, не работает для действительных 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:
Приложение Б. Анализ ссылки URI с помощью регулярного выражения
Поскольку алгоритм «первое совпадение-победа» идентичен «жадному» методу устранения неоднозначности, используемому в регулярных выражениях POSIX, естественно и часто использовать регулярное выражение для анализа пяти потенциальных компонентов ссылки URI.
Следующая строка - это регулярное выражение для разделения правильно сформированной ссылки URI на компоненты.
^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
12 3 4 5 6 7 8 9
Цифры во второй строке выше предназначены только для облегчения чтения; они указывают опорные точки для каждого подвыражения (т. е. каждой парной скобки).
http://74.125.226.70
и дай мне знать, как это работает :)