基本上我有一个字符串列表:
/forum/
/phpld/
/php/
现在我想检查是否有任何网址: http://www.url.com/forum/
包含字符串列表中的任何值。
在上述情况下,它应匹配,因为/ forum /位于网址中。
我在想这样的事情:
foreach (string filter in _filterList)
{
if (PAGEURL.Trim().Contains(filter.Trim()))
{
_parseResultsFinal.Add(PAGEURL);
filteredByURL++;
break;
}
}
但我不能让上述内容准确无误 我该怎么办? :)
答案 0 :(得分:3)
试试这个:
_filterList.Any(filter => PAGEURL.Trim().Contains(filter.Trim()));
您可以在此表达式之前执行PAGEURL = PAGEURL.Trim()
,以便每次都不运行它。
答案 1 :(得分:1)
String.Contains()区分大小写且对文化不敏感,因此如果有任何案例差异可能导致您遇到“不准确”。
如果您怀疑这可能是问题(或者甚至是可行的替代方案),您可以尝试将其作为'if'子句:
if (PAGEURL.Trim().IndexOf(filter.Trim(), StringComparison.OrdinalIgnoreCase) >= 0)
答案 2 :(得分:0)
我不清楚你想在这里做什么,似乎如果一个URL包含任何过滤器,那么你想将URL添加到列表中。
List<string> parseResultsFinal = new List<string>();
if (_filterList.Any(x => PAGEURL.Contains(x))
{
parseResultsFinal.Add(PAGEURL);
}
尝试使用它。
答案 3 :(得分:0)
我会尝试以下方法:
var trimmedUrl = PageURL.Replace("http://", "");
var parts = trimmedUrl.Split("/");
var filterList = new List<string> { "forum", "phpld", "php" }
var anyContains = parts.Any(o => filterList.contains(o));
答案 4 :(得分:0)
我将段过滤器更改为简单的单词(在添加到过滤器列表之前没有斜线,修剪):
var _filterList = new List<string>()
{
"forum", "phpld", "php"
};
使用正则表达式搜索url中的段(忽略大小写,url末尾的可选斜杠)
bool IsSegmentInUrl(string url, string segment)
{
string pattern = String.Format(".*/{0}(/|$)", segment);
return Regex.IsMatch(url, pattern, RegexOptions.IgnoreCase);
}
用法:
if (_filterList.Any(filter => IsSegmentInUrl(PAGEURL, filter))
{
_parseResultsFinal.Add(PAGEURL);
filteredByURL++;
}
更易读的解决方案 - 创建扩展方法
public static bool ContainsSegment(this string url, string segment)
{
string pattern = String.Format("http://.*/{0}(/|$)", segment);
return Regex.IsMatch(url, pattern, RegexOptions.IgnoreCase);
}
现在代码看起来非常自我描述:
if (_filterList.Any(filter => PAGEURL.ContainsSegment(filter))
{
_parseResultsFinal.Add(PAGEURL);
filteredByURL++;
}