如果您确保列表中只有域名(可以说是 ips),Bannedsites
那么您可以只查找域。
要获取 Uri 的域,请执行以下操作:
var uri = new Uri("http://stackoverflow.com/questions/11060418/c-sharp-string-parsing-containing-in-a-list");
Console.WriteLine(uri.DnsSafeHost);
输出是:
stackoverflow.com
现在你可以让它像这样工作(记得在 Bannedsites 中以大写形式存储):
var uri = new Uri(input)
if(Bannedsites.Contains(uri.DnsSafeHost.ToUpper(CultureInfo.InvariantCulture)))
{
//Don't go to that site
}
else
{
//Go to that site
}
这也将确保域不会偶然作为另一个字符串的一部分出现,例如作为参数的一部分。
另请注意,此方法将为您提供子域,因此:
var uri = new Uri("http://msdn.microsoft.com/en-US/");
Console.WriteLine(uri.DnsSafeHost);
返回:
msdn.microsoft.com
不仅:
microsoft.com
您还可以通过以下方式验证 uri 是否有效uri.IsWellFormedOriginalString()
:
var uri = new Uri(input)
if(uri.IsWellFormedOriginalString() && Bannedsites.Contains(uri.DnsSafeHost))
{
//Don't go to that site
}
else
{
//Go to that site
}
现在,假设您要考虑子域的细节,那么您可以这样做:
var uri = new Uri(input)
if(uri.IsWellFormedOriginalString() && Bannedsites.Any(x => uri.DnsSafeHost.EndsWith(x))
{
// Don't go to that site
}
else
{
// Go to that site
}
最后,如果您禁止特定页面而不是整个网络(在这种情况下,关注子域没有意义),那么您可以执行以下操作:
var uri = new Uri(input)
if(uri.IsWellFormedOriginalString() && Bannedsites.Contains((uri.DnsSafeHost + uri.AbsolutePath)))
{
//Don't go to that site
}
else
{
//Go to that site
}
使用 AbsolutePath 您可以处理那些“?” 和“#”通常用于传递参数,以及不会更改请求页面的任何其他字符。
您也可以考虑使用 Uri.Compare 并存储 Uri 列表而不是字符串列表。
正如RFC 1035所说:“对于作为官方协议一部分的 DNS 的所有部分,字符串(例如,标签、域名等)之间的所有比较都在不区分大小写的方式。”