2012-12-31 69 views
1

我正在尋找一種方法來識別頁面上的所有單詞,並計算每個單詞的每個實例在該頁面上的數量。我需要爲此使用JavaScript,並且不需要jQuery。如何查找頁面上的所有單詞以及每個單詞有多少個

UPDATE

這是我迄今爲止,儘管它似乎是工作,我仍然得到某些情況下,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]); 
    }); 
} 
+0

沒什麼到目前爲止,javascript不是我最強的一點,即時通訊不知道如何去做這個在javascript中第一個地方 – user1448020

+1

1)選擇所有文本節點2)將文本分割成單詞3)計算每個的出現次數字4)打印結果;在閱讀一個體面的Javascript教程後,你需要哪部分? –

+0

3a)對單詞列表進行排序3b)掃描列表以找到列表中相同的相鄰單元3c)在單詞 –

回答

1

使用這樣的正則表達式。

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

console.log(matches); 
+0

的某個位置存儲單元計數這種方法適用於某種情況。雖然我得到了大量的javascript和一些div元素。爲了測試我已經在這個頁面上運行:javascript:console.log(document.body.textContent) – user1448020

+0

我使用innerText得到了更好的結果。 document.body.innerText是否適用於所有瀏覽器(包括IE) – user1448020

+0

@ user1448020不確定,但您可以在Google上搜索兼容性。 – jeremy

1

你可以這樣使用。

var findWord="What"; 
var totalCount = document.body.innerText.split(findWord).length - 1; 
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> 
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); 
​ 

這將使用道格拉斯Crockford的walkDOM例如從JavaScript:好的部分。但是我從其他人那裏看到,document.body有一個innerText屬性?!那就是,呃,更容易。

我要離開這個答案了,因爲保持字數的方法可能對提問者有用。

相關問題