我想数一段中出现的特定单词的数量。
我正在为按键事件编写我的代码。我最初可能有几百个单词,以后可能会增加。
因此,当用户输入时,我将匹配段落中的单词,然后得到出现的次数。我还需要确保比赛将区分大小写。
现在我正在使用以下代码:
$('.msg').val().split("AP").length - 1其中AP是要匹配的关键字。
但我对此并不满意。
实际上我有一个几百个关键字的列表,我如何有效地实现它.
请注意要匹配的单词两边都有空格,即它们是边界词。
任何帮助都是非常感谢的。
发布于 2011-12-27 05:22:50
您可以尝试以下几种方法:
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在单词边界上进行测试。
对于大量的单词,您可能希望预先创建所有的regexe,而不是在循环中动态地重做它们,但是对于我的简单测试来说,它似乎很好,所以我认为我不会开始进行过早的优化。我把它留给读者.
发布于 2011-12-27 05:22:38
如果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++;
}
}
});我还没有测试过这个,但我希望你知道这个想法。
https://stackoverflow.com/questions/8641323
复制相似问题