我正在寻找识别页面上所有单词的方法,并计算该页面上每个单词的每个实例的数量。我需要使用JavaScript,而不是jQuery。
更新
这是我到目前为止所做的,虽然它似乎有效,但我仍然得到一些案例,其中有两个或更多的单词被合并在一起,任何线索?
if(window.attachEvent) {
window.attachEvent("onload", myFunc);
} else {
if(window.onload) {
var curronload = window.onload;
var newonload = function() {
curronload();
myFunc();
};
window.onload = newonload;
} else {
window.onload = myFunc;
}
}
function myFunc() {
var words = document.body.innerText;
words = words.replace(/\n/g, " "); //Remove line breaks
words = words.split(" ");
var foundWords = new Array();
var counts = new Array();
words.forEach(function(s) {
s = s.replace(/^\s+|\s+$/g,''); //Trim
s = s.toLowerCase(); //To lower case
var index = foundWords.indexOf(s);
if(s != \'\') { //If word not blank
if(index < 0) {
foundWords.push(s);
var newindex = foundWords.indexOf(s);
counts.push(1);
} else {
counts[index] += 1;
}
}
});
//Cycle through all found words and log the index, word & count
foundWords.forEach( function(s) {
var index = foundWords.indexOf(s);
console.log(index+" "+s+" "+counts[index]);
});
}
答案 0 :(得分:4)
我必须承认,我同意(有点讽刺)评论者首先要求对基本JavaScript进行一些研究。我认为这样做很有趣,所以这是我想出的第一件事。
它将单词的列表和频率输出到控制台。
当然,人们会想要过滤结果以使它们更好一些,但这是另一个问题。
var words = [];
var walkDOM = function (node, func) {
func(node);
node = node.firstChild;
while(node) {
walkDOM(node, func);
node = node.nextSibling;
}
};
walkDOM(document.body, function (node) {
if (node.nodeName === '#text') {
var text = node.textContent;
text = text.replace(/[^A-Za-z]/g, ' ');
text = text.split(' ');
if (text.length) {
for (var i = 0, length = text.length; i < length; i += 1) {
var matched = false,
word = text[i];
for (var j = 0, numberOfWords = words.length; j < numberOfWords; j += 1) {
if (words[j][0] === word) {
matched = true;
words[j][1] += 1;
}
}
if (!matched) {
words.push([word, 1]);
}
}
}
}
});
var displayWordList = function (words) {
for (var i = 0, length = words.length; i < length; i += 1) {
console.log(words[i][0], words[i][1]);
}
};
displayWordList(words);
这使用了Douglas Crockford的JavaScript中的walkDOM示例:The Good Parts。但我从其他人那里看到document.body的内部文本属性?!那就是,嗯,更容易。
我正在离开这个答案,因为保持字数的方法可能对提问者有用。
答案 1 :(得分:1)
使用这样的正则表达式。
var words = document.body.textContent || document.body.innerText,
matches = words.match(/word/gmi);
console.log(matches);
答案 2 :(得分:1)
你可以这样使用。
var findWord="What";
var totalCount = document.body.innerText.split(findWord).length - 1;
答案 3 :(得分:0)
你可以改进这个解决方案:
<!DOCTYPE html>
<html>
<body>
<p id="demo">Click the button to display the matches.</p>
<button onclick="myFunction()">Try it</button>
<script>
function myFunction()
{
var str="The rain in SPAIN stays mainly in the plain rain";
var n=str.match(/\S+/g);
document.getElementById("demo").innerHTML=n;
for(i=0; i < n.length ; i++){
r = str.match(new RegExp( n[i], 'g' ));
document.getElementById("demo").innerHTML+= '<br>'+ n[i] +' = ' + r.length ;
}
}
</script>
</body>
</html>