我有一个对象列表,我需要验证以检查给定的 url 是否存在于列表中。认为 LINQ 将是一个很好的方法,但我不太确定如何去做。
var url1 = new WhiteListItem() {Url = "*.aaaaa.com/*"};
var url2 = new WhiteListItem() { Url = "www.bbbbb.com/*" };
var url3 = new WhiteListItem() { Url = "www.ccccc.com" };
var url4 = new WhiteListItem() { Url = "www.ddddd.com/ddddddd" };
var validUrls = new List<WhiteListItem> {url1, url2, url3, url4};
只是为了澄清,我正在尝试为给定的 url 获取以下结果:
- 正确 - www.aaaaa.com/something?aaa=something/something
- 正确 - mobi.aaaaa.com/Something
- False - aaaaa.com (因为不存在子域)
- 正确 - www.bbbbb.com/something/something
- 正确 - www.bbbbb.com
- False - mobi.bbbbb.com (因为只允许 www 子域)
我想你明白了。请帮助或只是指出我正确的方向。代码示例将受到高度赞赏。
@stovroz,感谢你回到我身边。我想我应该做类似的事情,这是我的职责:如果您发现任何漏洞,请告诉我。不确定使用 stringbuilder 是否矫枉过正?
然后是最后一个问题,我怎么能说“/”可以出现在最后但不允许通过。
private static Regex CreateRegularExpression(string urlString)
{
var sb = new StringBuilder(urlString.Trim());
sb.Replace(".", @"\.");
if (sb.ToString().EndsWith(@"/"))
{
sb.Append("?");
}
if (sb.ToString().EndsWith(@"/*"))
{
sb.Insert(sb.Length - 1, '.');
}
if (sb.ToString().IndexOf("https://", StringComparison.Ordinal) >= 0)
{
sb.Replace("https://", @"\bhttps://");
}
else if (sb.ToString().IndexOf("http://", StringComparison.Ordinal) >= 0)
{
sb.Replace("http://", @"\bhttp://");
}
else
{
sb = new StringBuilder(Config.AllowedProtocolRegExp + sb.ToString());
}
sb.Replace(@"://*\.", @"://[\x2DA-Za-z0-9]*\.");
return new Regex(sb.ToString());
}
最佳答案
我认为如果您可以将白名单规则表达为正则表达式会更好,可以是单个复合正则表达式,也可以是单独的表达式列表并检查是否匹配,例如:
var whitelist = new [] {@".*\.aaaaa\.com/*.", @"www.bbbbb.com/.*"};
var list = new [] { "mobi.aaaaa.com/Something", "mobi.bbbbb.com/" };
var matches = list.Where(x => whitelist.Any(y => Regex.IsMatch(x, y)));
更新:
由于您有大量模式需要匹配,而这些模式已经采用通配符语法,因此您可以先使用以下函数将它们转换为 Regex 语法:
public string WildcardToRegex(string pattern)
{
return "^" + Regex.Escape(pattern).
Replace("\\*", ".*").
Replace("\\?", ".") + "$";
}
(来自 http://www.codeproject.com/Articles/11556/Converting-Wildcards-to-Regexes)
所以:
var wildcardWhitelist = new [] { "*.aaaaa.com/*", "www.bbbbb.com/*" };
var regexWhitelist = wildcardWhitelist.Select(x => WildcardToRegex(x));
var list = new [] { "mobi.aaaaa.com/Something", "mobi.bbbbb.com/" };
var matches = list.Where(x => regexWhitelist.Any(y => Regex.IsMatch(x, y)));
关于c# - 使用 linq 验证 URL 是否存在于列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29437887/