如何查找页面上的所有单词,以及每个单词的数量

时间:2012-12-31 18:57:12

标签: javascript

我正在寻找识别页面上所有单词的方法,并计算该页面上每个单词的每个实例的数量。我需要使用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]);
    });
}

4 个答案:

答案 0 :(得分:4)

我必须承认,我同意(有点讽刺)评论者首先要求对基本JavaScript进行一些研究。我认为这样做很有趣,所以这是我想出的第一件事。

它将单词的列表和频率输出到控制台。

当然,人们会想要过滤结果以使它们更好一些,但这是另一个问题。

http://jsfiddle.net/E7qSb/

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>