计算jquery中段落中区分大小写的单词的出现次数

时间:2011-12-27 04:58:51

标签: javascript jquery

我想计算段落中特定单词的出现次数。

我正在编写关键事件的代码。我最初可能会有几百个单词,可能会在以后增加。

因此,当用户输入时,我将匹配段落中的单词,然后获取出现次数。我还需要确保匹配区分大小写。

现在我正在使用此代码:

$('.msg').val().split("AP").length - 1

AP是要匹配的关键字。

但我对此并不满意。

实际上我有几百个关键字的列表,我该如何有效地实现它。

请注意匹配的单词在两边都有空格,即它们是边界词

感谢任何帮助

2 个答案:

答案 0 :(得分:2)

您可以尝试以下内容:

var wordList = ["some", "word", "or", "other", "CASE", "Sensitive", "is", "required"],
    wordCount = [];

for (var i=0; i < wordList.length; i++)
   wordCount[i] = 0;

$("#someField").keyup(function(){
   var i,
       text = this.value,
       re;
   for (i = 0; i < wordList.length; i++) {
      re = new RegExp("\\b" + wordList[i] + "\\b", "g");
      wordCount[i] = 0;
      while (re.test(text)) wordCount[i]++;
   }
});

演示:http://jsfiddle.net/zMdYg/2/(用更长的单词列表更新)

我真的不知道你想对结果做什么,所以我只是把它们放在一个简单的数组中,但你可以在演示中看到我然后将它们输出到页面,这样你就可以看到它正常工作了。显然你会在那个部分替换你自己的要求。

这是使用正则表达式来测试每个单词。您会注意到,使用.split().indexOf()您将获得部分匹配,例如,如果您查找“其他”,它也会在“麻烦”中途匹配(等等),但是正则表达式我使用\b来测试单词边界。

对于大量的单词列表,您可能需要提前创建所有正则表达式,而不是在循环中动态重做它们,但它似乎对我的简单测试工作正常,所以我想我不会开始做过早的最佳化。我将把它作为读者的练习......

答案 1 :(得分:1)

如果split()不区分大小写,那么我会考虑使用indexOf(),它区分大小写。

所以可能是这样的:

var words_array = ['one', 'two', 'three'];
var carot = 0;
var n_occurences = 0;

$.each(words_array, function(index, value){

  while(carot < $('.msg').val().length && carot > -1){

    carot = $('.msg').val().indexOf(' ' + words_array[index] + ' ', carot);

    if (carot > -1){

      n_occurences++;
    }
  }
});

我没有对此进行过测试,但我希望你能得到这个想法。