如何在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.filter
和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);
在jsfiddle
注意:以上所有Array
方法都需要在ECMA5之前的浏览器上使用垫片,可在各自的MDN页面上使用或使用es5_shim
如果您愿意 ,其他替代方法是使用Array.prototype.forEach
(需要填充程序), for
或while
执行元素的循环,并使用Array.prototype.slice
和Array.prototype.push
相关的循环。
在String.prototype.match
使用类似/(?:\s|^)#([^\s]+)/g
的RegExp ,即空格或行的开头,然后是#
,然后是非空格。
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()
来删除空格。