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 (#).
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.