3

我正在寻找一种方法来识别页面上的所有单词,并计算该页面上每个单词的每个实例的数量。我需要为此使用 JavaScript,而不是 jQuery。

更新

这是我到目前为止所拥有的,虽然它似乎正在工作,但我仍然遇到一些将 2 个或更多单词合并在一起的情况,有什么线索吗?

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

4 回答 4

8

我必须承认我同意(有些讽刺的)评论者敦促首先对基本 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);
​

这使用了来自 JavaScript: The Good Parts 的 Douglas Crockford 的 walkDOM 示例。但我从其他人那里看到 document.body 有一个 innerText 属性?!那,嗯,更容易。

我留下这个答案是因为保持字数统计的方法可能对提问者有用。

于 2012-12-31T19:32:30.300 回答
2

使用这样的正则表达式。

var words = document.body.textContent || document.body.innerText,
    matches = words.match(/word/gmi);

console.log(matches);
于 2012-12-31T19:09:42.830 回答
1

你可以这样使用。

var findWord="What";
var totalCount = document.body.innerText.split(findWord).length - 1;
于 2012-12-31T19:14:18.860 回答
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>
于 2012-12-31T19:20:47.250 回答