Compter des mots en ficelle

function WordCount(str) { var totalSoFar = 0; for (var i = 0; i < WordCount.length; i++) if (str(i) === " ") { // if a space is found in str totalSoFar = +1; // add 1 to total so far } totalsoFar += 1; // add 1 to totalsoFar to account for extra space since 1 space = 2 words } console.log(WordCount("Random String")); 

Je pense que je l'ai très bien marqué, sauf que je pense que la déclaration if est fausse. Comment puis-je dire if(str(i) contient un espace, ajouter 1.

Modifier:

J'ai découvert (grâce à Blender) que je peux le faire avec beaucoup moins de code:

 function WordCount(str) { return str.split(" ").length; } console.log(WordCount("hello world")); 

Utiliser des crochets, pas des parenthèses:

 str[i] === " " 

Ou bien:

 str.charAt(i) === " " 

Vous pouvez également le faire avec .split() :

 return str.split(' ').length; 

Essayez ces avant de réinventer les roues

De compter le nombre de mots en chaîne en utilisant JavaScript

 function countWords(str) { return str.trim().split(/\s+/).length; } 

À partir de http://www.mediacollege.com/internet/javascript/text/count-words.html

 function countWords(s){ s = s.replace(/(^\s*)|(\s*$)/gi,"");//exclude start and end white-space s = s.replace(/[ ]{2,}/gi," ");//2 or more space to 1 s = s.replace(/\n /,"\n"); // exclude newline with a start spacing return s.split(' ').length; } 

Notes de l'auteur:

Vous pouvez adapter ce script pour compter les mots de la manière que vous souhaitez. La partie importante est s.split ('') .length – cela compte les espaces. Le script tente d'enlever tous les espaces supplémentaires (double espaces, etc.) avant de compter. Si le texte contient deux mots sans espace entre eux, il les comptera en un seul mot, par ex. «Première phrase. Démarrer de la phrase suivante».

Une autre façon de compter les mots dans une chaîne. Ce code contient des mots qui contiennent uniquement des caractères alphanumériques et '_' char.

 function countWords(str) { var matches = str.match(/[\w\d]+/gi); return matches ? matches.length : 0; } 

Après avoir nettoyé la chaîne, vous pouvez associer des caractères non blancs ou des limites de mots.

Voici deux expressions régulières simples pour capturer des mots dans une chaîne:

  • Trae Da Marco Marco illustrddd Tram Da MarcoddddddMachachachachachou Trappeaúdddddiceúdiceeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea aleén aleldea /\S+/g
  • Caractères valides entre les limites des mots: /\b[az\d]+\b/g

L'exemple ci-dessous montre comment récupérer le nombre de mots à partir d'une chaîne, en utilisant ces modèles de capture.

 /*Redirect console output to HTML.*/document.body.innerHTML='';console.log=function(s){document.body.innerHTML+=s+'\n';}; /*String format.*/String.format||(String.format=function(f){return function(a){return f.replace(/{(\d+)}/g,function(m,n){return"undefined"!=typeof a[n]?a[n]:m})}([].slice.call(arguments,1))}); // ^ IGNORE CODE ABOVE ^ // ================= // Clean and match sub-strings in a string. function extractSubstr(str, regexp) { return str.replace(/[^\w\s]|_/g, '') .replace(/\s+/g, ' ') .toLowerCase().match(regexp) || []; } // Find words by searching for sequences of non-whitespace characters. function getWordsByNonWhiteSpace(str) { return extractSubstr(str, /\S+/g); } // Find words by searching for valid characters between word-boundaries. function getWordsByWordBoundaries(str) { return extractSubstr(str, /\b[az\d]+\b/g); } // Example of usage. var edisonQuote = "I have not failed. I've just found 10,000 ways that won't work."; var words1 = getWordsByNonWhiteSpace(edisonQuote); var words2 = getWordsByWordBoundaries(edisonQuote); console.log(String.format('"{0}" - Thomas Edison\n\nWord count via:\n', edisonQuote)); console.log(String.format(' - non-white-space: ({0}) [{1}]', words1.length, words1.join(', '))); console.log(String.format(' - word-boundaries: ({0}) [{1}]', words2.length, words2.join(', '))); 
 body { font-family: monospace; white-space: pre; font-size: 11px; } 

Je pense que cette méthode est plus que vous voulez

 var getWordCount = function(v){ var matches = v.match(/\S+/g) ; return matches?matches.length:0; } 

La manière la plus simple que j'ai trouvée jusqu'à présent est d'utiliser un regex avec split.

 var calculate = function() { var string = document.getElementById('input').value; var length = string.split(/[^\s]+/).length - 1; document.getElementById('count').innerHTML = length; }; 
 <textarea id="input">My super text that does 7 words.</textarea> <button onclick="calculate()">Calculate</button> <span id="count">7</span> words 

String.prototype.match renvoie un tableau, nous pouvons alors vérifier la longueur,

Je trouve que cette méthode est la plus descriptive

 var str = 'one two three four five'; str.match(/\w+/g).length; 

La réponse donnée par @ 7-isnotbad est extrêmement proche, mais ne compte pas les lignes à un seul mot. Voici le correctif, qui semble tenir compte de toute combinaison possible de mots, d'espaces et de nouvelles lignes.

 function countWords(s){ s = s.replace(/\n/g,' '); // newlines to space s = s.replace(/(^\s*)|(\s*$)/gi,''); // remove spaces from start + end s = s.replace(/[ ]{2,}/gi,' '); // 2 or more spaces to 1 return s.split(' ').length; } 
 <textarea name="myMessage" onkeyup="wordcount(this.value)"></textarea> <script type="text/javascript"> var cnt; function wordcount(count) { var words = count.split(/\s/); cnt = words.length; var ele = document.getElementById('w_count'); ele.value = cnt; } document.write("<input type=text id=w_count size=4 readonly>"); </script> 

Je sais qu'il est en retard, mais cette regex devrait résoudre votre problème. Cela correspondra et renverra le nombre de mots dans votre chaîne. Plutôt que celui que vous avez marqué comme une solution, qui compte l'espace-espace-mot comme 2 mots même si c'est vraiment un seul mot.

 function countWords(str) { var matches = str.match(/\S+/g); return matches ? matches.length : 0; } 

Vous avez des erreurs dans votre code.

 function WordCount(str) { var totalSoFar = 0; for (var i = 0; i < str.length; i++) { if (str[i] === " ") { totalSoFar += 1; } } return totalSoFar + 1; // you need to return something. } console.log(WordCount("Random String")); 

Il existe un autre moyen simple d'utiliser des expressions régulières:

 (text.split(/\b/).length - 1) / 2 

La valeur exacte peut différer d'environ 1 mot, mais elle compte également des limites de mots sans espace, par exemple "mot-mot". Et il ne compte pas de mots qui ne contiennent pas de lettres ou de chiffres.

Il peut y avoir un moyen plus efficace de le faire, mais c'est ce qui a fonctionné pour moi.

 function countWords(passedString){ passedString = passedString.replace(/(^\s*)|(\s*$)/gi, ''); passedString = passedString.replace(/\s\s+/g, ' '); passedString = passedString.replace(/,/g, ' '); passedString = passedString.replace(/;/g, ' '); passedString = passedString.replace(/\//g, ' '); passedString = passedString.replace(/\\/g, ' '); passedString = passedString.replace(/{/g, ' '); passedString = passedString.replace(/}/g, ' '); passedString = passedString.replace(/\n/g, ' '); passedString = passedString.replace(/\./g, ' '); passedString = passedString.replace(/[\{\}]/g, ' '); passedString = passedString.replace(/[\(\)]/g, ' '); passedString = passedString.replace(/[[\]]/g, ' '); passedString = passedString.replace(/[ ]{2,}/gi, ' '); var countWordsBySpaces = passedString.split(' ').length; return countWordsBySpaces; 

}

Il est capable de reconnaître tous les éléments suivants comme mots distincts:

abc,abc = 2 mots,
abc/abc/abc = 3 mots (fonctionne avec des barres obliques vers l'avant et vers l'arrière),
abc.abc = 2 mots,
abc[abc]abc = 3 mots,
abc;abc = 2 mots,

(Certaines autres suggestions, j'ai essayé de compter chaque exemple ci-dessus comme seulement 1 x mot), il aussi:

  • Ignore tous les espaces blancs avant et arrière

  • Compte une seule lettre suivie d'une nouvelle ligne, en tant que mot – ce que j'ai trouvé certaines des suggestions données sur cette page ne comptent pas, par exemple:
    une
    une
    une
    une
    une
    Parfois se compose de 0 x mots, et d'autres fonctions ne le comptent que 1 x mot, au lieu de 5 mots x)

Si quelqu'un a des idées sur la façon de l'améliorer, ou plus propre ou plus efficace – alors, ajoutez-nous 2 centimes! Espérons que cela aide quelqu'un.

Voici une fonction qui compte le nombre de mots dans un code HTML:

 $(this).val() .replace(/((&nbsp;)|(<[^>]*>))+/g, '') // remove html spaces and tags .replace(/\s+/g, ' ') // merge multiple spaces into one .trim() // trim ending and beginning spaces (yes, this is needed) .match(/\s/g) // find all spaces by regex .length // get amount of matches