Подсчитать количество слов в строке, используя JavaScript - PullRequest
9 голосов
/ 01 июля 2011

Я пытаюсь подсчитать количество слов в заданной строке, используя следующий код:

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 ]

15 голосов
/ 01 июля 2011

Вы можете использовать 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
9 голосов
/ 11 декабря 2014

Я бы предпочел решение только для 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

Скобки создают группу вокруг каждого совпадения.Таким образом, длина всех подходящих групп должна соответствовать количеству слов.

3 голосов
/ 01 июля 2011

Вы можете разумно использовать метод 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-теги, например

0 голосов
/ 28 мая 2016

Это лучшее решение, которое я нашел:

function wordCount(str) { var m = str.match(/[^\s]+/g) return m ? m.length : 0; }

Это инвертирует выбор пробела, который лучше, чем \w+, потому что он соответствует только латинскому алфавиту и _ (см. http://www.ecma -international.org / ecma-262 / 5.1 / # sec-15.10.2.6 )

Если вы не будете осторожны с сопоставлением пробелов, вы будете считать пустые строки, строки с начальными и конечными пробелами и все строки пробелов как совпадения, в то время как это решение правильно обрабатывает строки типа ' ', ' a\t\t!\r\n#$%() d ' (если вы определили 'исправить' как 0 и 4).

0 голосов
/ 09 мая 2015
//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);
...