13

Windows Hosts ファイルを使用すると、通常のインターネット ドメイン名よりはるかに自由度の高いホスト名に IP を関連付けることができます。特定の名前が有効な「ホスト」ファイル ドメイン名であるかどうかを判断する関数を作成したいと考えています。

この回答と何が機能し、何が機能しないかの実験に基づいて、私はこの機能を思いつきました:

private static bool IsValidDomainName(string domain)
{
    if (String.IsNullOrEmpty(domain) || domain.Length > 255)
    {
        return false;
    }

    Uri uri;

    if (!Uri.TryCreate("http://" + domain, UriKind.Absolute, out uri))
    {
        return false;
    }

    if (!String.Equals(uri.Host, domain, StringComparison.OrdinalIgnoreCase) || !uri.IsWellFormedOriginalString())
    {
        return false;
    }

    foreach (string part in uri.Host.Split('.'))
    {
        if (part.Length > 63)
        {
            return false;
        }
    }

    return true;
}

また、Unicode 名 (基本的な正規表現が失敗する場所) で動作するという利点もあります。

これを行うためのより良い/よりエレガントな方法はありますか?

UPDATE : Billが提案したように、Uri.CheckHostNameメソッドはほとんど私が望むことを行いますが、Windows が "hosts" ファイルで許可する "-test" のようなホスト名は許可されません。「-」の部分は特殊なケースですが、もっと特殊なケースがあるのではないかと心配しています。

4

2 に答える 2

39

System.Uri.CheckHostName()メソッドはどうですか?

private static bool IsValidDomainName(string name)
{
    return Uri.CheckHostName(name) != UriHostNameType.Unknown;
}

なぜ自分で仕事をするのですか?

于 2009-06-09T00:05:41.667 に答える