Comment extraire la valeur entre # et l’espace dans la valeur textarea

J’ai le code textarea suivant.

 

Je dois obtenir la valeur de textarea, suivre le contenu du message et extraire les mots-clés hachés (#).

Exemple si le message est comme ci-dessous

Ceci est mon message # message #lol #haha

Quand je clique sur le bouton soumettre. Les mots clés que je devrais obtenir sont ‘lol and’ haha ​​’et’ message ‘

J’utilise jQuery. Quelqu’un peut-il me donner des conseils sur la façon de s’y prendre?

Selon le commentaire, diviser les espaces, puis utilise Array.prototype.reduce en vérifiant le premier caractère.

Javascript

 var message = "This is my message #message #lol #haha"; var wanted = message.split(/\s/).reduce(function (previous, word) { if (word.charAt(0) === "#") { previous.push(word.slice(1)); } return previous; }, []).join(" "); console.log(wanted); 

Sortie

 message lol haha 

Sur jsfiddle

Vous pouvez également utiliser Array.prototype.filter et Array.prototype.map

Javascript

 var message = "This is my message #message #lol #haha"; var wanted = message.split(/\s/).filter(function (word) { return word.charAt(0) === "#"; }).map(function (word) { return word.slice(1); }).join(" "); console.log(wanted); 

Sur jsfiddle

Remarque: toutes les méthodes Array ci-dessus nécessitent un shim sur les navigateurs antérieurs à ECMA5, disponibles sur leurs pages MDN respectives ou l’utilisation de es5_shim.

Si vous le souhaitez , vous pouvez également utiliser Array.prototype.forEach (ce qui nécessiterait un shim), for ou while exécution de la mise en boucle d’éléments, ainsi que Array.prototype.slice et Array.prototype.push les éléments correspondants.

Utilisez un RegExp comme /(?:\s|^)#([^\s]+)/g avec Ssortingng.prototype.match , c’est-à-dire un espace ou un début de ligne, puis # , puis un non-espace.

 var m = 'This is my message #message #lol #haha'.match(/(?:\s|^)#([^\s]+)/g); // [" #message", " #lol", " #haha"] 

Ensuite, vous pouvez les parcourir avec votre boucle préférée, par exemple avec for

 var i, found = [], u; for (var i = 0; i < m.length; ++i) { u = m[i]; if (u.charAt(1) === '#') u = u.slice(2); else u = u.slice(1); found.push(u); } found; // ["message", "lol", "haha"] 

Avec le même RegExp , en raison de la manière dont j'ai configuré les groupes de capture, vous pouvez Ssortingng.prototype.replace et capturer en même temps à l'aide de Ssortingng.prototype.replace .

 var found = [], str = 'This is my message #message #lol #haha'; str = str.replace( /(?:\s|^)#([^\s]+)/g, function (m, keyword) { found.push(keyword); return ''; } ); str; // "This is my message" found; // ["message", "lol", "haha"] 

Une légère modification ici pourrait également vous permettre de les capturer en utilisant replace sans les supprimer, ( return m dans la fonction ou conservez simplement une autre copie de la chaîne).

 var str = "This is my message #message #lol #haha"; // or var str = $('#message').val(); var words = str.split(' '); words = $(words).map(function (i,v) { if(v.indexOf('#') === 0)return v.replace("#",''); }).get(); console.log(words); //output `==>` ["message", "lol", "haha"] 

Démo ---> http://jsfiddle.net/vTpSk/2/

 // You split the words with the space var arrayContainingEveryWords = $("#message").val().split(" "); var desiredWords = []; // For each word within the text area for (var i = 0; i < arrayContainingEveryWords.length; i++) { var word = arrayContainingEveryWords[i]; // If the first letter of the word is a # if (word.charAt(0) == "#") { // Add the word (minus the #) to an array desiredWords.push(word.slice(1)); } } console.log(desiredWords); 

Vous pouvez utiliser une expression régulière simple: \B#\w+ .

 var keywords = 'This is my message #message #lol #haha'.match(/\B#\w+/g); 

Et puis supprimez le # s si besoin est:

 keywords = keywords.map(function(k) { return k.subssortingng(1); }); // or jQuery, for compatibility: keywords = $.map(keywords, function() { return this.subssortingng(1); }); 

Ou utilisez une boucle:

 var keywords = []; var keyword; var re = /\B#(\w+)/g; while(keyword = re.exec('This is my message #message #lol #haha')) { keywords.push(keyword[1]); } 

Utilisez .split('#') sur la chaîne pour obtenir un tableau de mots, puis utilisez .sortingm() sur chaque élément pour supprimer l’espace.