如何从 URL 获取域名
How to get the domain name from an URL
此处的目标是了解给定 URL 是否在给定域中。
例如,我的域名是:www.google.fr
我需要知道这个:http://token.google.fr/news/something 是否在域
中
我有一个 Uri 的哈希集,其中包含我需要检查的所有 URL,我的域也在一个 Uri 对象中。
有没有办法通过操纵 Uri 对象来做到这一点?
我曾尝试比较两者 Uri.Authority
但由于我们可能有前缀和/或后缀,因此 Uri.Compare()
不可用。
您可以拆分 Uri.Authority
并检查 TLD 和域名,它们应该始终是拆分的最后两个元素(假设它是有效的 URL)
例子
Uri uri1 = new Uri("http://test.google.ca/test/test.html");
Uri uri2 = new Uri("http://google.ca/test/test.html");
string[] uri1Parts = uri1.Authority.Split(new char[] { '.' });
string[] uri2Parts = uri2.Authority.Split(new char[] { '.' });
//Check the TLD and the domain
if (uri1Parts[uri1Parts.Length - 1] == uri2Parts[uri2Parts.Length - 1] && uri1Parts[uri1Parts.Length - 2] == uri2Parts[uri2Parts.Length - 2])
{
Console.WriteLine(uri1Parts[uri1Parts.Length - 2] + "." + uri1Parts[uri1Parts.Length - 1]);
}
编辑
如果您的 URI 有端口,您需要将它们考虑在内。这是一个更好的版本。
public static bool AreSameDomain(Uri uri1, Uri uri2)
{
string uri1Authority = uri1.Authority;
string uri2Authority = uri2.Authority;
//Remove the port if port is specified
if (uri1Authority.IndexOf(':') >= 0)
{
uri1Authority = uri1Authority.Substring(0, uri1Authority.IndexOf(':'));
}
if (uri2Authority.IndexOf(':') >= 0)
{
uri2Authority = uri1Authority.Substring(0, uri2Authority.IndexOf(':'));
}
string[] uri1Parts = uri1Authority.Split(new char[] { '.' });
string[] uri2Parts = uri2Authority.Split(new char[] { '.' });
return (uri1Parts[uri1Parts.Length - 1] == uri2Parts[uri2Parts.Length - 1] //Checks the TLD
&& uri1Parts[uri1Parts.Length - 2] == uri2Parts[uri2Parts.Length - 2]); //Checks the Domain Name
}
我可能完全误解了您的意图,但这是否有用:
Uri u1 = new Uri("http://token.google.fr/news/something");
Uri u2 = new Uri("http://www.google.fr");
string domain1 = u1.Authority.Substring(u1.Authority.IndexOf('.') + 1);
string domain2 = u2.Authority.Substring(u2.Authority.IndexOf('.') + 1);
只需比较两个字符串 "domain1" 和 "domain2"。
此处的目标是了解给定 URL 是否在给定域中。
例如,我的域名是:www.google.fr 我需要知道这个:http://token.google.fr/news/something 是否在域
中我有一个 Uri 的哈希集,其中包含我需要检查的所有 URL,我的域也在一个 Uri 对象中。
有没有办法通过操纵 Uri 对象来做到这一点?
我曾尝试比较两者 Uri.Authority
但由于我们可能有前缀和/或后缀,因此 Uri.Compare()
不可用。
您可以拆分 Uri.Authority
并检查 TLD 和域名,它们应该始终是拆分的最后两个元素(假设它是有效的 URL)
例子
Uri uri1 = new Uri("http://test.google.ca/test/test.html");
Uri uri2 = new Uri("http://google.ca/test/test.html");
string[] uri1Parts = uri1.Authority.Split(new char[] { '.' });
string[] uri2Parts = uri2.Authority.Split(new char[] { '.' });
//Check the TLD and the domain
if (uri1Parts[uri1Parts.Length - 1] == uri2Parts[uri2Parts.Length - 1] && uri1Parts[uri1Parts.Length - 2] == uri2Parts[uri2Parts.Length - 2])
{
Console.WriteLine(uri1Parts[uri1Parts.Length - 2] + "." + uri1Parts[uri1Parts.Length - 1]);
}
编辑
如果您的 URI 有端口,您需要将它们考虑在内。这是一个更好的版本。
public static bool AreSameDomain(Uri uri1, Uri uri2)
{
string uri1Authority = uri1.Authority;
string uri2Authority = uri2.Authority;
//Remove the port if port is specified
if (uri1Authority.IndexOf(':') >= 0)
{
uri1Authority = uri1Authority.Substring(0, uri1Authority.IndexOf(':'));
}
if (uri2Authority.IndexOf(':') >= 0)
{
uri2Authority = uri1Authority.Substring(0, uri2Authority.IndexOf(':'));
}
string[] uri1Parts = uri1Authority.Split(new char[] { '.' });
string[] uri2Parts = uri2Authority.Split(new char[] { '.' });
return (uri1Parts[uri1Parts.Length - 1] == uri2Parts[uri2Parts.Length - 1] //Checks the TLD
&& uri1Parts[uri1Parts.Length - 2] == uri2Parts[uri2Parts.Length - 2]); //Checks the Domain Name
}
我可能完全误解了您的意图,但这是否有用:
Uri u1 = new Uri("http://token.google.fr/news/something");
Uri u2 = new Uri("http://www.google.fr");
string domain1 = u1.Authority.Substring(u1.Authority.IndexOf('.') + 1);
string domain2 = u2.Authority.Substring(u2.Authority.IndexOf('.') + 1);
只需比较两个字符串 "domain1" 和 "domain2"。