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

本文关键字:字符串 列表 包含 | 更新日期: 2023-09-27 18:37:19

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

为了详细说明我到底想要什么,这是一个例子:我有一个列表禁止网站 = 新列表 { "网站" };

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

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

提前感谢!

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

您可以使用

LINQ 的.Any来帮助解决这个问题:

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

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

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