Si desea analizar una URL, use java.net.URI. java.net.URLtiene un montón de problemas: su equalsmétodo realiza una búsqueda de DNS, lo que significa que el código que lo usa puede ser vulnerable a ataques de denegación de servicio cuando se usa con entradas no confiables.
"Señor Gosling, ¿por qué hizo que url sea igual de malo?" explica uno de esos problemas. Solo tiene la costumbre de usar en su java.net.URIlugar.
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;
}
Debes hacer lo que quieras.
Aunque parece funcionar bien, ¿hay algún enfoque mejor o hay algunos casos límite que podrían fallar?
Su código como escrito falla para las URL válidas:
httpfoo/bar- URL relativa con un componente de ruta que comienza con http.
HTTP://example.com/ - el protocolo no distingue entre mayúsculas y minúsculas.
//example.com/ - URL relativa del protocolo con un host
www/foo - una URL relativa con un componente de ruta que comienza con www
wwwexample.com- nombre de dominio que no comienza con www.pero comienza con www.
Las URL jerárquicas tienen una gramática compleja. Si intentas rodar tu propio analizador sin leer cuidadosamente RFC 3986, probablemente te equivoques. Simplemente use el que está integrado en las bibliotecas principales.
Si realmente necesita lidiar con entradas desordenadas que java.net.URIrechaza, consulte RFC 3986 Apéndice B:
Apéndice B. Análisis de una referencia de URI con una expresión regular
Como el algoritmo "first-match-wins" es idéntico al método de desambiguación "codicioso" utilizado por las expresiones regulares POSIX, es natural y común usar una expresión regular para analizar los cinco componentes potenciales de una referencia URI.
La siguiente línea es la expresión regular para descomponer una referencia de URI bien formada en sus componentes.
^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
12 3 4 5 6 7 8 9
Los números en la segunda línea anterior son solo para ayudar a la legibilidad; indican los puntos de referencia para cada subexpresión (es decir, cada paréntesis emparejado).
http://74.125.226.70decirme cómo funciona :)