如何在textarea值中提取#和空间之间的值

我有以下textarea代码。

 

我需要获取textarea的值并跟踪消息内容并提取出散列的关键字(#)。

如果消息如下所示的示例

这是我的消息#message #lol #haha

当我点击提交按钮。 我应该得到的关键词是“大声笑”,“哈哈”和“消息”。

我正在使用jquery。 任何人都可以给我一些关于如何这样做的建议吗?

根据注释,在空格分割,然后通过检查第一个字符使用Array.prototype.reduce

使用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); 

产量

 message lol haha 

在jsfiddle

或者使用Array.prototype.filterArray.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); 

在jsfiddle

注意:以上所有Array方法都需要在ECMA5之前的浏览器上使用垫片,可在各自的MDN页面上使用或使用es5_shim

如果您愿意 ,其他替代方法是使用Array.prototype.forEach (需要填充程序), forwhile执行元素的循环,并使用Array.prototype.sliceArray.prototype.push相关的循环。

String.prototype.match使用类似/(?:\s|^)#([^\s]+)/gRegExp ,即空格或行的开头,然后是# ,然后是非空格。

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

然后你可以用你喜欢的循环遍历这些循环,例如用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"] 

使用相同的RegExp ,由于我如何设置捕获组,您可以使用String.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"] 

这里稍作修改也可以让你使用replace捕获它们而不删除它们(在函数中 return m或只保留字符串的另一个副本)。

 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"] 

演示---> 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); 

您可以使用一个简单的正则表达式: \B#\w+

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

如果需要,然后删除#s:

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

或者使用循环:

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

在字符串上使用.split('#')来获取单词数组,然后在每个项目上使用.trim()来删除空格。