Étant donné une URL, je souhaite extraire le nom de domaine (il ne doit pas inclure la partie «www»). L'URL peut contenir http / https. Voici le code java que j'ai écrit. Bien que cela semble fonctionner correctement, existe-t-il une meilleure approche ou existe-t-il des cas extrêmes qui pourraient échouer.
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;
}
Entrée: http://google.com/blah
Sortie: google.com
http://74.125.226.70
me faire savoir comment cela fonctionne :)http://www.de/
ouhttp://www.com/
ne donnera pas les résultats souhaités.Réponses:
Si vous souhaitez analyser une URL, utilisez
java.net.URI
.java.net.URL
a un tas de problèmes - saequals
méthode effectue une recherche DNS, ce qui signifie que le code qui l'utilise peut être vulnérable aux attaques par déni de service lorsqu'il est utilisé avec des entrées non fiables."M. Gosling - pourquoi avez-vous fait que l'URL est nul?" explique un de ces problèmes. Prenez simplement l'habitude d'utiliser à la
java.net.URI
place.devrait faire ce que vous voulez.
Votre code tel qu'il est écrit échoue pour les URL valides:
httpfoo/bar
- URL relative avec un composant de chemin commençant parhttp
.HTTP://example.com/
- le protocole est insensible à la casse.//example.com/
- URL relative du protocole avec un hôtewww/foo
- une URL relative avec un composant de chemin commençant parwww
wwwexample.com
- nom de domaine qui ne commence pas parwww.
mais commence parwww
.Les URL hiérarchiques ont une grammaire complexe. Si vous essayez de lancer votre propre analyseur sans lire attentivement la RFC 3986, vous vous tromperez probablement. Utilisez simplement celui qui est intégré aux bibliothèques principales.
Si vous avez vraiment besoin de gérer des entrées désordonnées qui
java.net.URI
rejettent, consultez RFC 3986, annexe B:la source
www.google.com
est une URL relative avec un composant de chemin qui estwww.google.com
. Par exemple, si résolu contrehttp://example.com/
, vous obtiendrezhttp://example.com/www.google.com
.Lire la suite
la source
Voici une ligne courte et simple utilisant
InternetDomainName.topPrivateDomain()
dans Guava:InternetDomainName.from(new URL(url).getHost()).topPrivateDomain().toString()
Étant donné
http://www.google.com/blah
, cela vous donneragoogle.com
. Ou, étant donnéhttp://www.google.co.mx
, cela vous donneragoogle.co.mx
.Comme Sa Qada l'a commenté dans une autre réponse sur ce post , cette question a été posée plus tôt: Extraire le nom de domaine principal d'une URL donnée . La meilleure réponse à cette question est de Satya , qui suggère InternetDomainName.topPrivateDomain () de Guava
Mettre cela avec
URL.getHost()
, que le message original contient déjà, vous donne:la source
J'ai écrit une méthode (voir ci-dessous) qui extrait le nom de domaine d'une URL et qui utilise une simple correspondance String. Ce qu'il fait réellement est d'extraire le bit entre le premier
"://"
(ou index0
s'il n'y en a pas"://"
) et le premier suivant"/"
(ou indexString.length()
s'il n'y a pas de suivant"/"
). Le"www(_)*."
bit précédent restant est coupé. Je suis sûr qu'il y aura des cas où cela ne sera pas assez bon mais cela devrait être assez bon dans la plupart des cas!Le message de Mike Samuel ci-dessus dit que la
java.net.URI
classe pouvait le faire (et était préférée à lajava.net.URL
classe) mais j'ai rencontré des problèmes avec laURI
classe. Notamment,URI.getHost()
donne une valeur nulle si l'url n'inclut pas le schéma, c'est-à-dire le"http(s)"
bit.la source
http://bob.com:8080/service/read?name=robert
J'ai fait un petit traitement après la création de l'objet URI
la source
Dans mon cas, je n'avais besoin que du domaine principal et non du sous-domaine (pas de "www" ou quel que soit le sous-domaine):
Avec cette méthode, l'url " https://rest.webtoapp.io/llSlider?lg=en&t=8 " aura pour domaine "webtoapp.io".
la source
essayez celui-ci: java.net.URL;
JOptionPane.showMessageDialog (null, getDomainName (nouvelle URL (" https://en.wikipedia.org/wiki/List_of_Internet_top-level_domains ")));
la source
Il y a une question similaire Extraire le nom de domaine principal d'une URL donnée . Si vous regardez cette réponse , vous verrez que c'est très facile. Vous avez juste besoin d'utiliser
java.net.URL
et d'String
utilité -Split
la source
Explication: Le regex a 4 groupes. Les deux premiers sont des groupes non correspondants et les deux suivants sont des groupes correspondants.
Le premier groupe qui ne correspond pas est "http" ou "https" ou ""
Le deuxième groupe non correspondant est «www». ou ""
Le deuxième groupe correspondant est le domaine de premier niveau
Le premier groupe correspondant est tout ce qui suit les groupes non correspondants et tout ce qui se trouve avant le domaine de premier niveau
La concaténation des deux groupes correspondants nous donnera le nom de domaine / hôte.
PS: notez que vous pouvez ajouter n'importe quel nombre de domaines pris en charge à l'expression régulière.
la source
Si l'URL d'entrée est une entrée utilisateur. cette méthode donne le nom d'hôte le plus approprié. s'il n'est pas trouvé, renvoie l'url d'entrée.
la source
Tout ce qui précède est bon. Celui-ci me semble vraiment simple et facile à comprendre. Excusez les citations. Je l'ai écrit pour Groovy dans une classe appelée DataCenter.
Et voici quelques tests junit4:
la source
Une des façons dont j'ai fait et travaillé pour tous les cas consiste à utiliser Guava Library et regex en combinaison.
getDomain () peut être n'importe quelle méthode courante avec regex.
la source
Pour obtenir le nom de domaine réel, sans le sous-domaine, j'utilise:
Notez que cela ne fonctionnera pas avec les domaines de second niveau (comme .co.uk).
la source