Получить только доменное имя из URL? - PullRequest
33 голосов
/ 28 января 2010

Я пытаюсь извлечь только имя домена из строки URL. У меня почти есть ... Я использую URI

У меня есть строка. Первой мыслью было использовать Regex, но затем я решил использовать класс URI

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

Мне нужно преобразовать вышеперечисленное в google.com и google без www

.

Я сделал следующее

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

В основном это возвращает www.google.com .... я хотел бы попытаться вернуть 2 формы, если это возможно ... как уже упоминалось ...

google.com и Google

Возможно ли это с помощью URI?

Ответы [ 12 ]

28 голосов
/ 28 января 2010

Да, возможно использование:

Uri.GetLeftPart( UriPartial.Authority )
17 голосов
/ 13 февраля 2011

@ Dewfy: недостаток в том, что ваш метод возвращает «uk» для «www.test.co.uk», но домен здесь явно «test.co.uk».

@ naivists: недостаток в том, что ваш метод возвращает «beta.microsoft.com» для «www.beta.microsoft.com», но домен здесь явно «microsoft.com»

Мне нужно было то же самое, поэтому я написал класс, который вы можете скопировать и вставить в свое решение. Он использует жестко закодированный массив строк из tld. http://pastebin.com/raw.php?i=VY3DCNhp

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

выходы microsoft.com

и

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

выходы microsoft.co.uk

6 голосов
/ 28 января 2010

google.com не обязательно совпадает с www.google.com (ну, в данном случае это технически, но может быть и иначе).

Может быть, вам действительно нужно удалить домен верхнего уровня и субдомен www? Тогда просто split('.') и примите участие до последней части!

5 голосов
/ 12 ноября 2014

Я испробовал почти все подходы, но все они не достигли желаемого результата. Итак, вот мой подход с учетом servermanfail.

TLD файл доступен на https://publicsuffix.org/list/ Я взял файл из https://publicsuffix.org/list/effective_tld_names.dat, проанализирую его и поищу. Если опубликованы новые материалы, просто загрузите последний файл.

веселись.

using System;
using System.Collections.Generic;
using System.IO;

namespace SearchWebsite
{
internal class NetDomain
{
    static public string GetDomainFromUrl(string Url)
    {
        return GetDomainFromUrl(new Uri(Url));
    }

    static public string GetDomainFromUrl(string Url, bool Strict)
    {
        return GetDomainFromUrl(new Uri(Url), Strict);
    }

    static public string GetDomainFromUrl(Uri Url)
    {
        return GetDomainFromUrl(Url, false);
    }

    static public string GetDomainFromUrl(Uri Url, bool Strict)
    {
        initializeTLD();
        if (Url == null) return null;
        var dotBits = Url.Host.Split('.');
        if (dotBits.Length == 1) return Url.Host; //eg http://localhost/blah.php = "localhost"
        if (dotBits.Length == 2) return Url.Host; //eg http://blah.co/blah.php = "localhost"
        string bestMatch = "";
        foreach (var tld in DOMAINS)
        {
            if (Url.Host.EndsWith(tld, StringComparison.InvariantCultureIgnoreCase))
            {
                if (tld.Length > bestMatch.Length) bestMatch = tld;
            }
        }
        if (string.IsNullOrEmpty(bestMatch))
            return Url.Host; //eg http://domain.com/blah = "domain.com"

        //add the domain name onto tld
        string[] bestBits = bestMatch.Split('.');
        string[] inputBits = Url.Host.Split('.');
        int getLastBits = bestBits.Length + 1;
        bestMatch = "";
        for (int c = inputBits.Length - getLastBits; c < inputBits.Length; c++)
        {
            if (bestMatch.Length > 0) bestMatch += ".";
            bestMatch += inputBits[c];
        }
        return bestMatch;
    }


    static private void initializeTLD()
    {
        if (DOMAINS.Count > 0) return;

        string line;
        StreamReader reader = File.OpenText("effective_tld_names.dat");
        while ((line = reader.ReadLine()) != null)
        {
            if (!string.IsNullOrEmpty(line) && !line.StartsWith("//"))
            {
                DOMAINS.Add(line);
            }
        }
        reader.Close();
    }


    // This file was taken from https://publicsuffix.org/list/effective_tld_names.dat

    static public List<String> DOMAINS = new List<String>();
}

}

5 голосов
/ 15 ноября 2012

Ниже приведен код, который будет содержать только расширение SLD плюс gTLD или ccTLD (обратите внимание на исключение ниже). Мне плевать на DNS.

Теория выглядит следующим образом:

  • Все, что не превышает 3 токенов, остается неизменным, например. «localhost», «domain.com», в противном случае: последний токен должен быть расширением gTLD или ccTLD.
  • Предпоследний токен считается частью расширения, если его длина <3 ИЛИ, если он включен в список исключений. </li>
  • Наконец, токен до этого считается SLD. Все, что до этого считается поддоменом или определителем хоста, например, Www.

Что касается кода, короткий и сладкий:

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;
}

Очевидным исключением является то, что это не касается двухбуквенных доменных имен. Так что если вам повезло владеть ab.com, вам нужно немного адаптировать код. Для нас, простых смертных, этот код будет охватывать практически все рДВУ и нДВУ, за исключением нескольких очень экзотических.

3 голосов
/ 28 января 2010

См. Блог Рика Страля недавно как Справочник по некоторым c # и .net centric:

Смысл путей ASP.NET

3 голосов
/ 28 января 2010

Я думаю, что вы демонстрируете неправильное понимание того, что представляет собой «доменное имя» - не существует такого понятия, как «чистое доменное имя» в обычном использовании - это то, что вам нужно будет определить, если вы хотите последовательных результатов.
Вы просто хотите снять часть "www"?И затем есть другая версия, которая удаляет домен верхнего уровня (например, удаляет части ".com" или ".co.uk" и т. Д.) В другом ответе упоминается split (".") - вам нужно будет что-то использоватьнапример, если вы хотите исключить определенные части имени хоста вручную, в платформе .NET нет ничего, что точно соответствовало бы вашим требованиям - вам нужно реализовать это самостоятельно.

1 голос
/ 27 ноября 2017

Использовать Nager.PublicSuffix

установочный пакет Nager.PublicSuffix

var domainParser = new DomainParser(new WebTldRuleProvider());

var domainName = domainParser.Get("sub.test.co.uk");
//domainName.Domain = "test";
//domainName.Hostname = "sub.test.co.uk";
//domainName.RegistrableDomain = "test.co.uk";
//domainName.SubDomain = "sub";
//domainName.TLD = "co.uk";
1 голос
/ 22 мая 2013

Хост Uri всегда возвращает домен (www.google.com), включая метку (www) и домен верхнего уровня (com). Но часто вы хотели бы извлечь средний бит. Просто делаю

Uri uri;
bool result = Uri.TryCreate(returnUri, UriKind.Absolute, out uri);
if (result == false)
    return false;

//if you are sure it's not "localhost"
string domainParts = uri.Host.Split('.');
string topLevel = domainParts[domainParts.Length - 1]
string hostBody = domainParts[domainParts.Length - 2]
string label = domainParts[domainParts.Length - 3]

Но вам нужно проверить domainParts.length, так как часто указанный URI похож на "google.com".

1 голос
/ 17 августа 2012

Да, я разместил решение здесь: http://pastebin.com/raw.php?i=raxNQkCF

Если вы хотите удалить расширение, просто добавьте

if (url.indexof(".")>-1) {url = url.substring(0, url.indexof("."))}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...