42 votes

Obtenez juste le nom de domaine à partir d’une URL?

Je suis en train d'extraire juste le nom de domaine à partir d'une chaîne d'URL. J'ai presque de l'avoir... je suis à l'aide de URI

J'ai une chaîne.. ma première pensée a été d'utiliser des Regex, mais j'ai ensuite décidé d'utiliser l'URI de la classe

http://www.google.com/url?sa=t&source=web&ct=res&cd=1&ved=0CAgQFjAA&url=http://www.test.com/&rct=j&q=test&ei=G2phS-HdJJWTjAfckvHJDA&usg=AFQjCNFSEAztaqtkaIvEzxmRm2uOARn1kQ

J'ai besoin de convertir les ci-dessus pour google.com et google sans les www

Je n'ai la suite

Uri test = new Uri(referrer);
log.Info("Domain part : " + test.Host);

En gros, cela revient www.google.com .... je voudrais essayer et renvoyer les 2 formes si possible... comme mentionné...

google.com et google

Est-ce possible avec l'URI?

29voto

Dewfy Points 11277

Oui, il est possible d’utiliser:

18voto

servermanfail Points 1761

@Dewfy: un défaut, c'est que votre méthode renvoie "royaume-uni" pour "www.test.co.uk" mais le domaine est ici clairement "test.co.royaume-uni".

@naivists: un défaut, c'est que votre méthode renvoie "beta.microsoft.com" pour "www.beta.microsoft.com" mais le domaine est ici clairement "microsoft.com"

J'avais besoin de la même chose, donc j'ai écrit une classe que vous pouvez copier et coller dans votre solution. Il utilise une codés en dur tableau de chaînes tld. http://pastebin.com/raw.php?i=VY3DCNhp

Console.WriteLine(GetDomain.GetDomainFromUrl("http://www.beta.microsoft.com/path/page.htm"));

sorties microsoft.com

et

Console.WriteLine(GetDomain.GetDomainFromUrl("http://www.beta.microsoft.co.uk/path/page.htm"));

sorties microsoft.co.uk

6voto

naivists Points 15639

google.com n’est pas garanti d’être le même que www.google.com (enfin, pour cet exemple, il est techniquement, mais peut être autrement).

peut-être ce que vous avez besoin est en fait supprimer le "niveau supérieur" domaine et le "www" subodmain? Ensuite, il suffit `` de prendre la partie avant la dernière partie!

5voto

anoordende Points 41

Ci-dessous est un code qui donnera juste le SLD plus gTLD ou ccTLD extension (note de l'exception ci-dessous). Je ne se soucient pas de DNS.

La théorie est la suivante:

  • Rien de moins de 3 jetons reste comme, par exemple, est "localhost", "domain.com" sinon: Le dernier jeton doit être un gTLD ou ccTLD extension.
  • L'avant-dernier jeton est considéré comme faisant partie de l'extension si elle est de longueur < 3 OU s'il est inclus dans une liste d'exceptions.
  • Enfin le jeton avant que l'un est considéré comme le SLD. Tout à l'avant qui est considéré comme un sous-domaine ou à un qualificatif, par exemple, Www.

Comme pour le code, short & sweet:

private static string GetDomainName(string url)
{
    string domain = new Uri(url).DnsSafeHost.ToLower();
    var tokens = domain.Split('.');
    if (tokens.Length > 2)
    {
        //Add only second level exceptions to the < 3 rule here
        string[] exceptions = { "info", "firm", "name", "com", "biz", "gen", "ltd", "web", "net", "pro", "org" }; 
        var validTokens = 2 + ((tokens[tokens.Length - 2].Length < 3 || exceptions.Contains(tokens[tokens.Length - 2])) ? 1 : 0);
        domain = string.Join(".", tokens, tokens.Length - validTokens, validTokens);
    }
    return domain;
}

L'exception évidente est que ce ne sera pas traiter avec le 2-lettre de noms de domaine. Donc, si vous êtes assez chanceux pour posséder ab.com vous aurez besoin d'adapter le code légèrement. Pour nous, simples mortels, ce code permet de couvrir à peu près tous les gTLD et les ccTLD, moins quelques très exotiques.

3voto

David_001 Points 2825

Je pense que vous êtes l'affichage d'une incompréhension de ce que constitue un "nom de domaine" - il n'y a pas une telle chose comme un "pur nom de domaine" dans l'usage commun - c'est quelque chose que vous aurez besoin de définir si vous voulez des résultats cohérents.
Voulez-vous simplement à enlever le "www" de la partie? Et puis une autre version qui dénude le domaine de niveau supérieur (par exemple. enlever le ".com" ou ".co.royaume-uni", etc pièces?) Une autre réponse mentionne split(".") - vous aurez besoin d'utiliser quelque chose comme ceci si vous souhaitez exclure des parties spécifiques de l'hôte manuellement, il n'y a rien à l'intérieur de l' .NET framework pour répondre exactement à vos besoins - vous aurez besoin de mettre en œuvre ces choses vous-même.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X