包含在列表中的C#字符串解析

时间:2012-06-16 02:57:19

标签: c# list split

我正在尝试为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字符串,则不能访问该站点。很抱歉,如果这是一个简单的代码,虽然我无法弄清楚,谷歌没有帮助。

提前致谢!

2 个答案:

答案 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的所有部分,全部 字符串之间的比较(例如,标签,域名等) 以不区分大小写的方式完成。 “