我正在尝试为c#创建一个解析系统,以阻止我的程序从位于列表中的“禁止”网站中获取图像。我尝试过使用bool类来做一个Regex.Replace操作,遗憾的是它没有用完。
详细说明我想要的内容,这是一个例子: 我有一个List BannedSites = new List {“site”};
if(Bannedsites.Contains(input))
{
Don't go to that site
}
else
{
Go to that site
}
虽然我主要得到的错误是我在列表中有“site”,但是如果有人在之后使用空格“site”,则会转到else语句,因为它不会直接存在于列表中,或者如果有人做“网站?”我们知道网址末尾的问号通常不会对访问网站产生影响,因此他们再次绕过它。是否可以执行某些操作,如果输入包含“site”,WITHING字符串,则不能访问该站点。很抱歉,如果这是一个简单的代码,虽然我无法弄清楚,谷歌没有帮助。
提前致谢!
答案 0 :(得分:5)
您可以使用LINQ的.Any
来帮助解决这个问题:
if(Bannedsites.Any(x => input.Contains(x)) {
// Don't go to that site
} else {
// Go to that site
}
请记住在所有内容上使用.ToUpperInvariant()
以使其不区分大小写。
答案 1 :(得分:2)
如果您确保列表Bannedsites
中只有域名(可以说是ips),那么您只能查找域名。
要获取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.IsWellFormedOriginalString()
验证uri是否有效:
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的所有部分,全部 字符串之间的比较(例如,标签,域名等) 以不区分大小写的方式完成。 “