Dado um URL, desejo extrair o nome de domínio (ele não deve incluir a parte 'www'). O URL pode conter http / https. Aqui está o código java que eu escrevi. Embora pareça funcionar bem, existe uma abordagem melhor ou há alguns casos extremos que podem falhar.
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
Saída: google.com
http://74.125.226.70
e deixe-me saber como isso funciona :)http://www.de/
ouhttp://www.com/
não dará os resultados desejados.Respostas:
Se você deseja analisar um URL, use
java.net.URI
.java.net.URL
tem muitos problemas - seuequals
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
.deve fazer o que quiser.
Seu código como escrito falha nos URLs válidos:
httpfoo/bar
- URL relativo com um componente de caminho que começa comhttp
.HTTP://example.com/
- o protocolo não diferencia maiúsculas de minúsculas.//example.com/
- URL relativo do protocolo com um hostwww/foo
- um URL relativo com um componente de caminho que começa comwww
wwwexample.com
- nome de domínio que não começa com,www.
mas começa comwww
.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:fonte
www.google.com
é uma URL relativa com um componente de caminho que éwww.google.com
. Por exemplo, se resolvido contrahttp://example.com/
, você obteriahttp://example.com/www.google.com
.Consulte Mais informação
fonte
Aqui está uma linha curta e simples usando
InternetDomainName.topPrivateDomain()
na Guava:InternetDomainName.from(new URL(url).getHost()).topPrivateDomain().toString()
Dado
http://www.google.com/blah
, isso lhe darágoogle.com
. Ou, dadohttp://www.google.co.mx
, isso lhe darágoogle.co.mx
.Como Sa Qada comentou em outra resposta deste post , essa pergunta foi feita anteriormente: Extraia o nome de domínio principal de um determinado URL . A melhor resposta para essa pergunta é de Satya , que sugere o InternetDomainName.topPrivateDomain () da Guava .
Colocar isso junto com o
URL.getHost()
que a postagem original já contém fornece:fonte
Eu escrevi um método (veja abaixo) que extrai o nome de domínio de um URL e que usa correspondência simples de String. O que ele realmente faz é extrair o bit entre o primeiro
"://"
(ou índice,0
se não houver"://"
) e o primeiro subsequente"/"
(ou o índice,String.length()
se não houver"/"
). O restante, o"www(_)*."
bit anterior é cortado. Tenho certeza de que haverá casos em que isso não será bom o suficiente, mas na maioria dos casos deve ser bom o suficiente!O post de Mike Samuel acima diz que a
java.net.URI
classe poderia fazer isso (e era preferível àjava.net.URL
classe), mas eu encontrei problemas com aURI
classe. Notavelmente,URI.getHost()
fornece um valor nulo se o URL não incluir o esquema, ou seja, o"http(s)"
bit.fonte
http://bob.com:8080/service/read?name=robert
Fiz um pequeno tratamento após a criação do objeto URI
fonte
No meu caso, eu só precisava do domínio principal e não do subdomínio (não "www" ou qualquer que seja o subdomínio):
Com este método a url " https://rest.webtoapp.io/llSlider?lg=en&t=8 " terá de domínio "webtoapp.io".
fonte
tente este: java.net.URL;
JOptionPane.showMessageDialog (null, getDomainName (novo URL (" https://en.wikipedia.org/wiki/List_of_Internet_top-level_domains "))));
fonte
Existe uma pergunta semelhante Extrair o nome de domínio principal de um determinado URL . Se você der uma olhada nesta resposta , verá que é muito fácil. Você só precisa usar
java.net.URL
eString
utilitário -Split
fonte
Explicação: O regex possui 4 grupos. Os dois primeiros são grupos não correspondentes e os próximos dois são grupos correspondentes.
O primeiro grupo não correspondente é "http" ou "https" ou ""
O segundo grupo não correspondente é "www". ou ""
O segundo grupo correspondente é o domínio de nível superior
O primeiro grupo correspondente é qualquer coisa depois dos grupos não correspondentes e qualquer coisa antes do domínio de nível superior
A concatenação dos dois grupos correspondentes nos fornecerá o nome de domínio / host.
PS: Observe que você pode adicionar qualquer número de domínios suportados à regex.
fonte
Se o URL de entrada for de entrada do usuário. esse método fornece o nome do host mais apropriado. se não encontrado, retorna o URL de entrada.
fonte
Todos os itens acima são bons. Este parece realmente simples para mim e fácil de entender. Desculpe as aspas. Eu escrevi para o Groovy dentro de uma classe chamada DataCenter.
E aqui estão alguns testes do junit4:
fonte
Uma das maneiras que fiz e trabalhei para todos os casos é usar a Biblioteca Guava e o regex em combinação.
getDomain () pode ser qualquer método comum com regex.
fonte
Para obter o nome de domínio real, sem o subdomínio, eu uso:
Observe que isso não funcionará com domínios de segundo nível (como .co.uk).
fonte