Dada una URL, quiero extraer el nombre de dominio (no debe incluir la parte 'www'). La URL puede contener http / https. Aquí está el código de Java que escribí. Aunque parece funcionar bien, ¿hay algún enfoque mejor o hay algunos casos límite que podrían fallar?
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;
}
Entrada: http://google.com/blah
Salida: google.com
http://74.125.226.70
decirme cómo funciona :)http://www.de/
ohttp://www.com/
no dará los resultados deseados.Respuestas:
Si desea analizar una URL, use
java.net.URI
.java.net.URL
tiene un montón de problemas: suequals
mé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.URI
lugar.Debes hacer lo que quieras.
Su código como escrito falla para las URL válidas:
httpfoo/bar
- URL relativa con un componente de ruta que comienza conhttp
.HTTP://example.com/
- el protocolo no distingue entre mayúsculas y minúsculas.//example.com/
- URL relativa del protocolo con un hostwww/foo
- una URL relativa con un componente de ruta que comienza conwww
wwwexample.com
- nombre de dominio que no comienza conwww.
pero comienza conwww
.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.URI
rechaza, consulte RFC 3986 Apéndice B:fuente
www.google.com
es una URL relativa con un componente de ruta que eswww.google.com
. Por ejemplo, si se resuelve en contrahttp://example.com/
, obtendráhttp://example.com/www.google.com
.Lee mas
fuente
Aquí hay una línea corta y simple usando
InternetDomainName.topPrivateDomain()
en guayaba:InternetDomainName.from(new URL(url).getHost()).topPrivateDomain().toString()
Dado
http://www.google.com/blah
, eso te darágoogle.com
. O, dadohttp://www.google.co.mx
, te darágoogle.co.mx
.Como Sa Qada comentó en otra respuesta en esta publicación , esta pregunta se ha hecho anteriormente: extraer el nombre de dominio principal de una URL dada . La mejor respuesta a esa pregunta es de Satya , quien sugiere InternetDomainName.topPrivateDomain () de Guava
Poner eso junto con
URL.getHost()
, que la publicación original ya contiene, te da:fuente
Escribí un método (ver más abajo) que extrae el nombre de dominio de una url y que usa una simple coincidencia de cadenas. Lo que realmente hace es extraer el bit entre el primero
"://"
(o el índice0
si no está"://"
contenido) y el primero subsiguiente"/"
(o el índiceString.length()
si no hay contenido posterior"/"
). El"www(_)*."
bit precedente restante se corta. Estoy seguro de que habrá casos en los que esto no será lo suficientemente bueno, ¡pero debería ser lo suficientemente bueno en la mayoría de los casos!La publicación anterior de Mike Samuel dice que la
java.net.URI
clase podría hacer esto (y era preferible a lajava.net.URL
clase) pero encontré problemas con laURI
clase. Notablemente,URI.getHost()
da un valor nulo si la url no incluye el esquema, es decir, el"http(s)"
bit.fuente
http://bob.com:8080/service/read?name=robert
Hice un pequeño tratamiento después de la creación del objeto URI
fuente
En mi caso, solo necesitaba el dominio principal y no el subdominio (no "www" o lo que sea el subdominio):
Con este método, la url " https://rest.webtoapp.io/llSlider?lg=en&t=8 " tendrá para el dominio "webtoapp.io".
fuente
pruebe este: java.net.URL;
JOptionPane.showMessageDialog (null, getDomainName (nueva URL (" https://en.wikipedia.org/wiki/List_of_Internet_top-level_domains ")));
fuente
Hay una pregunta similar Extraer el nombre de dominio principal de una URL dada . Si observa esta respuesta , verá que es muy fácil. Solo necesita usar
java.net.URL
yString
utilidad -Split
fuente
Explicación: La expresión regular tiene 4 grupos. Los dos primeros son grupos no coincidentes y los dos siguientes son grupos coincidentes.
El primer grupo no coincidente es "http" o "https" o ""
El segundo grupo no coincidente es "www". o ""
El segundo grupo coincidente es el dominio de nivel superior.
El primer grupo coincidente es cualquier cosa después de los grupos no coincidentes y cualquier cosa antes del dominio de nivel superior
La concatenación de los dos grupos coincidentes nos dará el nombre de dominio / host.
PD: tenga en cuenta que puede agregar cualquier cantidad de dominios compatibles a la expresión regular.
fuente
Si la url de entrada es entrada del usuario. Este método proporciona el nombre de host más apropiado. si no se encuentra, devuelve la url de entrada.
fuente
Todo lo anterior es bueno. Este me parece muy simple y fácil de entender. Disculpe las citas. Lo escribí para Groovy dentro de una clase llamada DataCenter.
Y aquí hay algunas pruebas junit4:
fuente
Una de las formas en que lo hice y trabajé para todos los casos es usar la Biblioteca de guayaba y la expresión regular en combinación.
getDomain () puede ser cualquier método común con regex.
fuente
Para obtener el nombre de dominio real, sin el subdominio, uso:
Tenga en cuenta que esto no funcionará con dominios de segundo nivel (como .co.uk).
fuente