包含在列表中的 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 末尾的问号通常对访问网站没有区别, 所以他们再次绕过它。是否可以做一些事情,如果输入包含"站点",使用字符串,使其不转到站点。抱歉,如果这是一个简单的代码,尽管我无法弄清楚,谷歌也没有帮助。
提前感谢!
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 的所有部分,所有字符串(例如标签、域名等)之间的比较以不区分大小写的方式完成。"