[英]Extract domain name from URL in C#
这个问题在其他语言/平台上有答案,但我找不到C#
的强大解决方案。 在这里,我正在寻找我们在WHOIS
使用的URL部分,因此我对子域,端口,架构等不感兴趣。
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都属于拥有xyz.com的人,我需要从URL中提取。
我需要相同的,所以我写了一个类,你可以复制并粘贴到你的解决方案中。 它使用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
正如@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;
}
}
你可以得到的最接近的是System.Uri.Host属性,它将提取sub1.xyz.com部分。 不幸的是,很难知道主机的“顶层”部分究竟是什么(例如sub1.foo.co.uk与sub1.xyz.com相比)
如果您需要域名,那么您可以在.net中使用URi.hostadress
如果你需要来自内容的网址,那么你需要使用正则表达式来解析它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.