1

我正在尝试为 c# 创建一个解析系统,以阻止我的程序从位于列表中的“禁止”网站获取图像。我曾尝试使用 bool 类来执行 Regex.Replace 操作,不幸的是它没有成功。

为了详细说明我到底想要什么,这是一个例子:我有一个 List BannedSites = new List { "site" };

 if(Bannedsites.Contains(input))
 { 
    Don't go to that site
 }
 else 
 { 
    Go to that site
 }

虽然我最常得到的错误是我在列表中有“站点”,但如果有人在“站点”之后使用空格,它会转到 else 语句,因为它不直接存在于列表中,或者如果有人这样做“地点?” 我们知道网址末尾的问号通常不会影响访问该网站,因此他们再次绕过它。如果输入包含“站点”,是否可以做一些事情,用字符串,让它不去站点。对不起,如果这是一个简单的代码,虽然我无法弄清楚,谷歌也没有帮助。

提前致谢!

4

2 回答 2

5

您可以使用 LINQ.Any来帮助解决这个问题:

if(Bannedsites.Any(x => input.Contains(x)) {
    // Don't go to that site
} else {
    // Go to that site
}

请记住.ToUpperInvariant()在所有内容上使用以使其不区分大小写。

于 2012-06-16T03:00:07.887 回答
2

如果您确保列表中只有域名(可以说是 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 的所有部分,字符串(例如,标签、域名等)之间的所有比较都在不区分大小写的方式。”

于 2012-06-16T03:39:43.380 回答