10
votes

Extraire le nom de domaine principal d'une URL donnée

J'ai utilisé ce qui suit pour extraire le domaine d'une URL: (ce sont des cas de test) xxx pré>

Je peux obtenir les résultats suivants: p>

google.com
hopperspot.com
socialrating.it
blogspot.com
xtop10.net
zoyanailpolish.blogspot.com


17 commentaires

Il ressemble aux regèges de Cet article pourrait vous aider =)


Alors ne mettez pas ces Woublewoos stupides dans votre motif. Si tout ce que vous voulez, c'est de S /^[^.]+\.//, alors je vous suggère de faire ça.


Pas clair ce que vous voulez, cependant. Essayez-vous de supprimer le premier composant toujours ou de tous les composants, mais celui-ci juste avant le TLD ou le premier uniquement lorsqu'il commence par un "WW" ou ....?


Il est non seulement de remplacer "ww". J'ai ajouté un nouvel exemple ci-dessus. Par exemple, "xtop10.net", ce que je veux, c'est: "xtop10.net". Tandis que "zoyanailpolish.blogspot.com" devrait être "blogspot.com"


Pour @tchrist, votre suggestion est une application à Vim, je pense. Mais ce que je veux, c'est différent. Je ne veux pas seulement remplacer le premier "WW". Dans certains cas, par exemple, "xtop10.net". Ce que je veux, c'est "xtop10.net". Mais votre méthode reviendrait "net".


En d'autres termes, vous voulez le domaine principal et non sous-domaines. Correct?


Vous n'avez toujours pas expliqué ce que vous voulez. Maintenant, on dirait que vous devriez simplement vous séparer sur un point et garder les deux derniers éléments retournés.


Que diriez-vous de domaines comme exemple.tw et exemple.co.uk ?


à @jams Poulson, à droite. Je veux le domaine principal et non les sous-domaines


@Ballusc, dans vos cas. Je préfère revenir sans modification. Cela dit, il renvoie "exemple.com.tw" et "exemple.co.uk"


N'oubliez pas que '-' et d'autres personnages sont autorisés dans l'URL. (Pensez en dehors de l'ASCII)


Connexes: Stackoverflow.com/cevestions / 3199862 / ... Stackoverflow.com/Questtions/1923815/... Stackoverflow.com/questions/3199343/regex-to-match-Domain-cc TLD


Ne faites pas la voie dure Regex alors. Utiliser Regex pour ce type de problème est ridicule. Split sur DOT dans un tableau. Compter les pièces. Vérifiez si la deuxième dernière partie n'est pas <= 3 caractères et / ou démarrons avec co (il y a probablement d'autres ccTlds que vous souhaitez faire correspondre). Prenez les deux derniers ou trois éléments en fonction du résultat et joignez-les ensemble sur le point à nouveau.


@Ballusc, Droite. Je suis d'accord avec toi. Que voulez-vous dire la deuxième dernière partie n'est pas <= 3? Pourriez-vous expliquer plus?


Balusc fait probablement référence au nombre de caractères de la partie URL. Regex est cool mais vous devriez probablement tomber comme un outil en faveur de quelque chose d'autre si l'expression devient trop complexe.


Comment déterminez-vous si quelque chose est un «domaine principal» ou non? foo.bar.com et foo.bar.co.uk et foo.bar.pvt.k12.wy.us ne regarde pas rien de pareil. Comment déciderez-vous de déposer uniquement le FOO mais arrêtez-vous à la barre dans chacune d'elles, car vous obtenez un nombre différent de points de dos?


à @tchrist, à droite. Je ne suis peut-être pas considéré comme de nombreuses possibilités.


7 Réponses :


1
votes

La raison pour laquelle vous voyez zoyanailpolish.blogspot.com est que votre regex ne trouve que des chaînes qui commencent avec un 'ww'. Ce que vous demandez, c'est que, en plus de supprimer toutes les chaînes qui commencent par un «ww», cela devrait également fonctionner pour une chaîne à partir de «zoyanailpolish» (?). Dans ce cas, utilisez la regex String Regex = "^ ((WW | Z | A) [A-ZA-Z0-9 -] {0,} \\.)"; Cela supprimera n'importe quel mot qui commence par un "ww" ou "z" ou "a". Personnalisez-le en fonction de ce dont vous avez besoin exactement.


7 commentaires

Droit. En plus de supprimer toutes les chaînes commençant par un «WW». Il devrait également fonctionner pour une chaîne en commençant par d'autres (non seulement "zoya ongles vernis"). Par exemple, "xyz.blogspot.com".


Mais comme vous l'avez montré pour xtop10.net il ne supprime pas xtop10 - de sorte que cela signifie pour certaines chaînes qu'il ne supprime pas - non? La question est - est-ce une liste personnalisée de la chaîne que vous souhaitez ne pas supprimer ou une règle est basée sur laquelle cela fonctionne?


Pour @bhaskar, cela dépend. Par exemple, xtop10.net , c'est un site web. C'est un nom de domaine. Je n'ai pas besoin de changer de changement. Tandis que pour zoyanailpolish.blogspot.com , le nom de domaine doit être blogspot.com . Donc, je dois supprimer zoyanailpolish .


Il est très clair ce que @chnet veut: "Droite. Je veux le domaine principal et non les sous-domaines"


@James c'est? Ensuite, il aurait dû dire que, maintenant ne devrait-il pas? J'espère qu'il s'amuse à dire que .com , .co.uk et pvt.k12.wy.us tout compte comme le même genre de chose.


@chnet: Honnêtement, si l'obtention du nom de domaine est votre préoccupation, l'utilisation de regex n'est pas la bonne approche imo. Il existe d'autres techniques en Java pour analyser les URL et extraire des noms de domaine.


@Tchrist: Neuvième commentaire ci-dessous la question. J'ai deviné ce qui était nécessaire à partir de la dernière chaîne d'URL. Les chances sont que une regex nécessiterait une expression horrible pour tenir compte de toutes les possibilités afin de poster des solutions alternatives.



8
votes

Obtenez l'hôte via REGEX est assez compliqué ou impossible car les TLD n'obéissent pas à des règles simples, mais sont fournis par l'ICANN et le changement de temps.

Vous devez utiliser la fonctionnalité fournie par la bibliothèque Java comme ceci: xxx


2 commentaires

Eh bien, oui, mais il a déjà tout ça. Il veut parfois déplacer parfois un certain nombre d'éléments de premier plan du nom d'hôte Little-Endian, bien qu'il ne nous ait pas dit comment savoir combien d'entre elles pourraient être. Il semble penser que nous pouvons les noms de domaine des yeux et savoir si la partie que nous avons est la partie "principale" déjà ou non. Je ne pense pas que ce soit possible.


Pour le compte rendu, cela ne répond pas à la question. Cela renvoie le nom de domaine fourni, y compris le sous-domaine. L'OP cherchait le nom de domaine "racine" sans sous-domaine, donc si donné "www.google.com", il devrait renvoyer "google.com". Cette méthode renvoie "www.google.com". Cela fonctionne bien si vous essayez simplement d'obtenir le domaine d'une URL avec une chaîne de chemin et / ou de requête.



2
votes

Comme suggéré par Balusc et d'autres, la solution la plus pratique consisterait à obtenir une liste de TLDS (voir ceci Liste ), enregistrez-les dans un fichier, chargez-les, puis déterminez ce que TLD est utilisé par une chaîne d'URL donnée. À partir de là, vous pouvez constituer le nom de domaine principal comme suit:

    String url = "zoyanailpolish.blogspot.com";

    String tld = findTLD( url ); // To be implemented. Add to helper class ?

    url = url.replace( "." + tld,"");  

    int pos = url.lastIndexOf('.');

    String mainDomain = "";

    if (pos > 0 && pos < url.length() - 1) {
        mainDomain = url.substring(pos + 1) + "." + tld;
    }
    // else: Main domain name comes out empty


5 commentaires

Pour @james Poulson, merci. Désolé, quelle est la sortie de votre exemple? Je ne comprends pas vraiment. Il supprimez TLD d'abord, puis ajoutez-le plus tard. Alors, quelle est la sortie finale?


Il n'y a pas de sortie car c'est pseudocode. Une liste de fichiers texte doit être créée (TLDS peut être trouvé sur la liaison Wikipedia), il faut être lu dans une structure de données et la méthode FindTTLD doit être remplie. Si cela est fait correctement, cela devrait faire ce que vous voulez. Dans ce cas donnerait blogspot.com.


à @jams Poulson, à droite. Supposons que je reçois TLD, l'exemple pseudo supprimerait .com de l'URL. Ensuite, il se déplace vers la position de point avant blogspot . De cette façon, vous pouvez supprimer zoyanailpolish .


C'est l'idée :) . Si vous rencontrez des problèmes de l'obtenir pour travailler, faites-le-moi savoir.


Ce n'est probablement plus une bonne idée car il y a des milliers de nouveaux TLD à venir dans les prochaines années.



4
votes

Ceci est 2013 et la solution que j'ai trouvée est simple: xxx


0 commentaires

12
votes

Utilisation de la bibliothèque GUAVA, nous pouvons facilement obtenir un nom de domaine:

InternetDomainName.from(tld).topPrivateDomain()


0 commentaires

3
votes

C'est beaucoup plus simple: xxx


1 commentaires

Ce qui se passe avec: www.zoyanailpolish.blogspot.co.uk



1
votes
InternetDomainName.from("test.blogspot.com").topDomainUnderRegistrySuffix() -> blogspot.com

0 commentaires