【问题标题】:How to search for multiple sub-strings in a single query如何在单个查询中搜索多个子字符串
【发布时间】:2013-03-18 21:22:28
【问题描述】:

我遇到了一个我无法进一步思考的问题。 简而言之,我有一个ul 和数百个li,每个li 有几十个单词作为文本;在列表的最顶部,我放置了一个输入框,供用户输入一些关键字;例如,假设我想从那个巨大的列表中过滤掉同一行中存在以下三个单词的行:“red sweet strawberries”。点击搜索按钮后,这些行被过滤掉了,我只有两行包含我感兴趣的单词。

li1:“我迫不及待地想吃一些红甜草莓

li2:“现在是夏天,红甜草莓现在很新鲜”

到目前为止一切都很好。

当三个查找的单词被字符串中的其他单词或字符分隔时,就会出现问题。 因此,以上面的示例为例,过滤器永远不会向我显示以下行:

li3:“红色甜草莓现已上市”

所以,在这里我列出了过滤和整理上例中结果的整个函数:

$(document).ready(function() {
      var links = new Array();
      $("h4").each(function(index, element) {
      links.push({
            text: $(this).text(),
            element: element
        });
    });

    $("#searchbutton").click(function() {
        var query = $("#inputtext").val();
        var querywords = query.split(',');

        var results = new Array();
        for(var i = 0; i < querywords.length; i++) {
            for(var j = 0; j < links.length; j++) {
                if (links[j].text.toLowerCase().indexOf(querywords[i].toLowerCase()) > -1) {
                    results.push(links[j].element);                    
                    }
            }
        }

        $("h4").each(function(index, element) {
            this.style.display = 'none';
        });
        for(var i = 0; i < results.length; i++) {
            results[i].style.display = 'block';
        }

    });     

});

是否可以搜索多个子字符串并得到结果,即使子字符串之间用字符或其他单词分隔?

【问题讨论】:

  • 在第一个for循环中querytext不应该是querywords吗?
  • 是的,查询词。我已经更新了!在这个论坛上,我刚刚将所有“querytext”更改为“querywords”(在我的示例中强调单词的作用)并且我跳过了那个。谢谢。但这不是原因。
  • 迈克M。我已经尝试过您的代码以适合我的功能,但不幸的是,由于我对 RegEx 语法的理解不佳,我无法使其工作。现在我正在学习这个 RegEx 的全部内容。再次感谢您的代码。
  • 抱歉,我错过了在测试中使用代码时不需要的文本和元素属性查找。我已经更新了代码并添加了一个指向有效 JSFIDDLE 的链接。

标签: javascript regex indexof


【解决方案1】:

这是做我认为你想做的事情的一种方法。

var results = new Array();
for ( var i = 0; i < querywords.length; i++ ) {
    var regex = new RegExp( 
        '(?=.*\\b' + querywords[i].split(' ').join('\\b)(?=.*\\b') + '\\b)', 'i'
    );
    for ( var j = 0; j < links.length; j++ ) {
        if ( regex.test( links[j].text ) ) {
            results.push( links[j].element );
        }
    }
}

例如,如果querywords 包含项目"red sweet strawberries",则创建的regex 将是

/(?=.*\bred\b)(?=.*\bsweet\b)(?=.*\bstrawberries\b)/i

使用三个正数look-aheads,以便在同一行包含三个单词的字符串通过测试(如果它们被单词边界包围)。

演示:JSFIDDLE.

【讨论】:

  • 这是一个了不起的工作,MikeM !您的解决方案必须在围绕 google 搜索的此问题的热门搜索查询中。我现在看到 indexOf 对于更广泛的搜索功能非常有限。非常感谢您的努力...问候!
【解决方案2】:

如果我理解正确的话,整个问题是:

var querywords = query.split(',');

在示例查询中,您没有逗号。所以我想这是一个错误?用空格分割查询:

var querywords = query.split(' ');

【讨论】:

  • 如果我用空格分割,那么结果会给我返回一行“red”、一行“sweet”等等。
  • 我不是在寻找用户拆分任何东西,因为他希望找到一个两个或三个单词的表达式一起而不是拆分。
  • 但是为什么用逗号分隔呢?这没有意义。只需用空格分割查询。您可以简单地测试在每行中找到了多少查询词。仅添加找到所有查询词的行。或者您可以按找到的查询词的数量对行进行排序。你想让查询词靠近吗?确保 indexOf 的返回值之间的差异不会太大。也许正则表达式可以解决您的问题。
  • 我想我可能会接近解决方案;正如我所说,如果我用空格分割,我会得到至少找到一个单词的所有结果;如果我能够过滤,那么只有找到所有 3 个单词的结果(在同一行中)我会是一个快乐的学习者;所以这就是我卡住的地方:如何过滤并仅返回找到所有 3 个单词的行?
  • Vetvicka,你如何“只添加所有查询词被发现的行”?如果函数在同一个句子中找到所有 3 个单词。
猜你喜欢
  • 2020-06-25
  • 2011-06-29
  • 2017-06-30
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多