Подсчитать количество слов в строке, используя JavaScript
Я пытаюсь подсчитать количество слов в данной строке, используя следующий код:
var t = document.getElementById('MSO_ContentTable').textContent;
if (t == undefined) {
var total = document.getElementById('MSO_ContentTable').innerText;
} else {
var total = document.getElementById('MSO_ContentTable').textContent;
}
countTotal = cword(total);
function cword(w) {
var count = 0;
var words = w.split(" ");
for (i = 0; i < words.length; i++) {
// inner loop -- do the count
if (words[i] != "") {
count += 1;
}
}
return (count);
}
В этом коде я получаю данные из тега div и отправляю их cword()
функция для подсчета. Хотя возвращаемое значение отличается в IE и Firefox. Есть ли какие-либо изменения в регулярном выражении? Одна вещь, которую я показываю, что оба браузера отправляют одну и ту же строку, есть проблема внутри cword()
функция.
5 ответов
Вы можете разумно использовать метод replace(), хотя вы ничего не заменяете.
var str = "the very long text you have...";
var counter = 0;
// lets loop through the string and count the words
str.replace(/(\b+)/g,function (a) {
// for each word found increase the counter value by 1
counter++;
})
alert(counter);
регулярное выражение может быть улучшено, чтобы исключить HTML-теги, например
Ты можешь использовать split
и добавить счетчик слов в String
прототип:
String.prototype.countWords = function(){
return this.split(/\s+/).length;
}
'this string has five words'.countWords(); //=> 5
Если вы хотите исключить такие вещи, как... или - в предложении:
String.prototype.countWords = function(){
return this.split(/\s+\b/).length;
}
'this string has seven ... words - and counting'.countWords(); //=> 7
Я бы предпочел только решение RegEx:
var str = "your long string with many words.";
var wordCount = str.match(/(\w+)/g).length;
alert(wordCount); //6
Регулярное выражение
\w+ between one and unlimited word characters
/g greedy - don't stop after the first match
Скобки создают группу вокруг каждого матча. Таким образом, длина всех подходящих групп должна соответствовать количеству слов.
Это лучшее решение, которое я нашел:
function wordCount(str) {
var m = str.match(/[^\s]+/g)
return m ? m.length : 0;
}
Это инвертирует выбор пробела, который лучше, чем \w+
потому что он соответствует только латинскому алфавиту и _ (см. http://www.ecma-international.org/ecma-262/5.1/)
Если вы не будете осторожны с сопоставлением пробелов, вы будете считать пустые строки, строки с начальными и конечными пробелами, а также все строки пробелов как совпадения, в то время как это решение обрабатывает такие строки, как ' '
, ' a\t\t!\r\n#$%() d '
правильно (если вы определите "правильно" как 0 и 4).
//Count words in a string or what appears as words :-)
function countWordsString(string){
var counter = 1;
// Change multiple spaces for one space
string=string.replace(/[\s]+/gim, ' ');
// Lets loop through the string and count the words
string.replace(/(\s+)/g, function (a) {
// For each word found increase the counter value by 1
counter++;
});
return counter;
}
var numberWords = countWordsString(string);