Se você deseja analisar um URL, use java.net.URI
. java.net.URL
tem muitos problemas - seu equals
método faz uma pesquisa de DNS, o que significa que o código usado pode ser vulnerável a ataques de negação de serviço quando usado com entradas não confiáveis.
"Sr. Gosling - por que você fez url igual a merda?" explica um desses problemas. Basta adquirir o hábito de usar 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;
}
deve fazer o que quiser.
Embora pareça funcionar bem, existe uma abordagem melhor ou há alguns casos extremos que podem falhar.
Seu código como escrito falha nos URLs válidos:
httpfoo/bar
- URL relativo com um componente de caminho que começa com http
.
HTTP://example.com/
- o protocolo não diferencia maiúsculas de minúsculas.
//example.com/
- URL relativo do protocolo com um host
www/foo
- um URL relativo com um componente de caminho que começa com www
wwwexample.com
- nome de domínio que não começa com, www.
mas começa com www
.
URLs hierárquicos têm uma gramática complexa. Se você tentar rolar o seu próprio analisador sem ler atentamente o RFC 3986, provavelmente errará. Basta usar o que está incorporado nas bibliotecas principais.
Se você realmente precisa lidar com entradas confusas que java.net.URI
rejeitam, consulte o RFC 3986 Apêndice B:
Apêndice B. Analisando uma Referência de URI com uma Expressão Regular
Como o algoritmo "first-match-wins" é idêntico ao método de desambiguação "ganancioso" usado pelas expressões regulares do POSIX, é natural e comum usar uma expressão regular para analisar os cinco componentes potenciais de uma referência de URI.
A linha a seguir é a expressão regular para decompor uma referência de URI bem formada em seus componentes.
^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
12 3 4 5 6 7 8 9
Os números na segunda linha acima são apenas para ajudar na legibilidade; eles indicam os pontos de referência para cada subexpressão (ou seja, cada parêntese emparelhado).
http://74.125.226.70
e deixe-me saber como isso funciona :)