Windows Hosts 文件允许您将 IP 与比普通 Internet 域名具有更大自由度的主机名相关联。我想创建一个函数来确定给定名称是否是有效的“主机”文件域名。
基于这个答案和对什么有效和无效的实验,我想出了这个功能:
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 名称一起使用(基本的正则表达式会失败)。
有没有更好/更优雅的方法来做到这一点?
更新:正如Bill所建议的那样,Uri.CheckHostName方法几乎可以满足我的要求,但它不允许 Windows 允许在“主机”文件中使用诸如“-test”之类的主机名。我会对“-”部分进行特殊处理,但我担心还有更多特殊情况。