5

この質問には他の言語/プラットフォームでの回答がありますが、で堅牢なソリューションを見つけることができませんでしたC#。ここでは、使用するURLの部分を探しているWHOISので、サブドメイン、ポート、スキーマなどには興味がありません。

Example 1: http://s1.website.co.uk/folder/querystring?key=value => website.co.uk
Example 2: ftp://username:password@website.com => website.com

whoisの所有者が同じである場合、結果は同じになるはずです。したがって、sub1.xyz.comとsub2.xyz.comはどちらも、URLから抽出する必要があるxyz.comを持っている人に属します。

4

4 に答える 4

5

同じものが必要だったので、ソリューションにコピーして貼り付けることができるクラスを作成しました。これは、ハードコードされた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

于 2011-02-13T07:41:48.490 に答える
3

@Peteが指摘したように、これは少し複雑ですが、試してみます。

このアプリケーションには、既知のTLDの完全なリストが含まれている必要があることに注意してください。これらはhttp://publicsuffix.org/から取得できます。読者のための演習として、このサイトからリストを抽出したままにしました。

class Program
{
    static void Main(string[] args)
    {
        var testCases = new[]
        {
            "www.domain.com.ac",
            "www.domain.ac",
            "domain.com.ac",
            "domain.ac",
            "localdomain",
            "localdomain.local"
        };

        foreach (string testCase in testCases)
        {
            Console.WriteLine("{0} => {1}", testCase, UriHelper.GetDomainFromUri(new Uri("http://" + testCase + "/")));
        }

        /* Produces the following results:

            www.domain.com.ac => domain.com.ac
            www.domain.ac => domain.ac
            domain.com.ac => domain.com.ac
            domain.ac => domain.ac
            localdomain => localdomain
            localdomain.local => localdomain.local
         */
    }
}

public static class UriHelper
{
    private static HashSet<string> _tlds;

    static UriHelper()
    {
        _tlds = new HashSet<string>
        {
            "com.ac",
            "edu.ac",
            "gov.ac",
            "net.ac",
            "mil.ac",
            "org.ac",
            "ac"

            // Complete this list from http://publicsuffix.org/.
        };
    }

    public static string GetDomainFromUri(Uri uri)
    {
        return GetDomainFromHostName(uri.Host);
    }

    public static string GetDomainFromHostName(string hostName)
    {
        string[] hostNameParts = hostName.Split('.');

        if (hostNameParts.Length == 1)
            return hostNameParts[0];

        int matchingParts = FindMatchingParts(hostNameParts, 1);

        return GetPartOfHostName(hostNameParts, hostNameParts.Length - matchingParts);
    }

    private static int FindMatchingParts(string[] hostNameParts, int offset)
    {
        if (offset == hostNameParts.Length)
            return hostNameParts.Length;

        string domain = GetPartOfHostName(hostNameParts, offset);

        if (_tlds.Contains(domain.ToLowerInvariant()))
            return (hostNameParts.Length - offset) + 1;

        return FindMatchingParts(hostNameParts, offset + 1);
    }

    private static string GetPartOfHostName(string[] hostNameParts, int offset)
    {
        var sb = new StringBuilder();

        for (int i = offset; i < hostNameParts.Length; i++)
        {
            if (sb.Length > 0)
                sb.Append('.');

            sb.Append(hostNameParts[i]);
        }

        string domain = sb.ToString();
        return domain;
    }
}
于 2010-11-08T12:05:46.217 に答える
1

取得できる最も近いものは、sub1.xyz.com部分を抽出するSystem.Uri.Hostプロパティです。残念ながら、ホストの「トップレベル」部分が正確に何であるかを知ることは困難です(たとえば、sub1.foo.co.ukとsub1.xyz.com)

于 2010-11-08T02:07:25.507 に答える
0

ドメイン名が必要な場合は、.netでURi.hostadressを使用できます

コンテンツのURLが必要な場合は、正規表現を使用してそれらを解析する必要があります。

于 2010-11-09T12:42:07.923 に答える