2009-02-09 8 views
2

J'essaie d'extraire le nom de domaine d'une chaîne en C#. Vous ne devez pas nécessairement utiliser une expression régulière, mais nous devrions être en mesure d'extraire yourdomain.com de toutes les conditions suivantes:Expression régulière pour extraire le nom de domaine de n'importe quel domaine

yourdomain.com 
www.yourdomain.com 
http://www.yourdomain.com 
http://www.yourdomain.com/ 
store.yourdomain.com 
http://store.yourdomain.com 
whatever.youdomain.com 
*.yourdomain.com 

En outre, tout TLD est acceptable, remplacez donc tout ce qui précède avec .net, .org, 'co'uk, etc.

Répondre

15
  1. Si aucun schéma n'est présent (pas de deux-points dans la chaîne), ajoutez "http: //" pour en faire une URL valide.

  2. Transmettez la chaîne à Uri constructor.

  3. Accédez au code Host property de l'URI.

Maintenant, vous avez le nom d'hôte. Ce que vous considérez exactement comme le «nom de domaine» d'un nom d'hôte donné est un point discutable. Je suppose que vous ne voulez pas simplement dire tout après le premier point.

Il n'est pas possible de distinguer les noms d'hôtes tels que 'whatever.youdomain.com' de domaines-dans-un-SLD comme 'warwick.ac.uk' des seules chaînes de caractères. En effet, il y a même un peu de zone grise sur ce qui est et n'est pas un SLD public, étant donné les efforts de certains bureaux d'enregistrement pour se tailler des créneaux.

Une approche courante consiste à conserver une grande liste de SLD et d'autres suffixes utilisés par des entités non apparentées. C'est ce que les navigateurs Web font pour empêcher le partage de cookies publics indésirables. Une fois que vous avez trouvé un suffixe public, vous pouvez ajouter le préfixe le plus proche dans le nom d'hôte divisé par des points pour obtenir l'entité de plus haut niveau responsable du nom d'hôte donné, si c'est ce que vous voulez. Les listes de suffixes sont un enfer à maintenir, mais vous pouvez vous appuyer sur someone else's efforts. Sinon, si votre application dispose de l'heure et de la connexion réseau pour le faire, elle peut commencer à rechercher des informations sur le nom d'hôte. par exemple. il pourrait faire une requête whois pour le nom d'hôte, et continuer à regarder chaque parent jusqu'à ce qu'il obtienne un résultat et ce serait le nom de domaine de l'entité de plus bas niveau responsable du nom d'hôte donné.Ou, si tout cela est trop de travail, vous pouvez essayer de couper tout «www» présent de premier plan!

+0

+1 pour utiliser les ressources existantes –

+1

Il existe une bibliothèque C# opensource qui utilise publicsuffix.org pour analyser les domaines, ici: http://code.google. com/p/domainname-parser / –

0

Une regex ne correspond pas vraiment à votre exigence de "aucun TLD", puisque le format et le nombre de TLDs sont assez grands et en constante évolution. Si vous limité votre portée à:

(?<domain>[^\.]+\.([A-Z]+$|co\.[A-Z]$)) 

Vous attraper .anything et .co.anything, que j'imagine couvre les cas les plus réalistes ...

+0

Je n'ai pas vraiment besoin de TLD, mais j'ai besoin des plus populaires. –

+0

Cette regex couvre tous les TLD populaires (.anything et .co.anything). Cela suppose que vous supprimerez la barre oblique finale s'il y en a une. –

+0

Il y a beaucoup, beaucoup de SLD populaires qui n'impliquent pas .co. – bobince

0

Jetez un oeil à ce other answer. C'était pour PHP, mais vous pourrez facilement obtenir l'expression rationnelle sur les 4-5 lignes de PHP et vous pourrez profiter de la discussion qui a suivi (voir Alnitak's answer).

Questions connexes