Якщо ви хочете розібрати 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:
Додаток B. Розбір посилань на URI з регулярним виразом
Оскільки алгоритм "перший-матч-виграш" ідентичний методу "жадібного" роз'яснення, використовуваному регулярними виразами POSIX, природно і звичайно використовувати регулярний вираз для розбору потенційних п'яти компонентів посилання URI.
Наступний рядок - це регулярний вираз для розбиття добре сформованої посилання URI на його компоненти.
^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
12 3 4 5 6 7 8 9
Номери у другому рядку вище лише сприяють читанню; вони вказують опорні точки для кожної піддепресії (тобто для кожної парної дужки).
http://74.125.226.70
і дайте мені знати, як це виходить :)