c# - 使用 linq 验证 URL 是否存在于列表中

标签 c# linq

我有一个对象列表,我需要验证以检查给定的 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 获取以下结果:

  1. 正确 - www.aaaaa.com/something?aaa=something/something
  2. 正确 - mobi.aaaaa.com/Something
  3. False - aaaaa.com (因为不存在子域)
  4. 正确 - www.bbbbb.com/something/something
  5. 正确 - www.bbbbb.com
  6. 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/

相关文章:

c# - 提高 LINQ 枚举器内条件查询的性能

c# - LINQ导致无效的类型转换吗?

asp.net - 在 vb.net 中比较对象与 Nothing

c# - 现在是在 ASP.NET MVC 中使用多线程的好时机吗?它是如何实现的?

c# - 设置相对于最后一行文本的光标位置C# 控制台应用程序

c# - "Error creating window handle"定义覆盖的 WndProc 方法后

linq - NHibernate Linq 提供者和 take() skip() 与急切获取

.net - 在学习 LINQ to XML 之前我应该​​了解哪些 XML 相关技术?

C# 用模式替换捕获的字符串?

c# - 为什么当文件超过 4mb 时,Azure 文件共享 openReadAsync() 会中断?