0

基本上我有一个这样的字符串列表:

/forum/
/phpld/
/php/

现在我想检查是否有任何网址: http ://www.url.com/forum/

包含字符串列表中的任何值。

在上述情况下,它应该匹配,因为 /forum/ 在 url 中。

我在想这样的事情:

foreach (string filter in _filterList)
{
    if (PAGEURL.Trim().Contains(filter.Trim()))
    {
        _parseResultsFinal.Add(PAGEURL);
        filteredByURL++;
        break;
    }
}

但我无法让上述内容准确,我该怎么做?:)

4

5 回答 5

3

试试这个:

_filterList.Any(filter => PAGEURL.Trim().Contains(filter.Trim()));

您可以PAGEURL = PAGEURL.Trim()在此表达式之前不每次都运行它。

于 2012-11-30T10:31:38.067 回答
1

String.Contains() 区分大小写且不区分区域性,因此如果存在任何大小写差异,可能会导致您遇到“不准确”。

如果您怀疑这可能是问题所在(甚至作为可行的替代方案),您可以尝试将其作为“if”子句:

if (PAGEURL.Trim().IndexOf(filter.Trim(), StringComparison.OrdinalIgnoreCase) >= 0)

于 2012-11-30T10:39:45.673 回答
0

我不太清楚你想在这里做什么,好像一个 URL 包含任何过滤器,然后你想将该 URL 添加到列表中。

List<string> parseResultsFinal = new List<string>();
if (_filterList.Any(x => PAGEURL.Contains(x))
{
   parseResultsFinal.Add(PAGEURL);
}

尝试使用它。

于 2012-11-30T10:31:53.823 回答
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));
于 2012-11-30T10:33:12.887 回答
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++;
}
于 2012-11-30T10:42:19.350 回答