我有以下文本区域代码。
<textarea id="message" name="message"></textarea>
我需要获取 textarea 的值并跟踪消息内容并提取散列 (#) 的关键字。
例如,如果消息如下
这是我的消息#message #lol #haha
当我点击提交按钮时。我应该得到的关键字是'lol'和'haha'和'message'。
我正在使用 jquery。谁能给我一些关于如何去做的建议?
我有以下文本区域代码。
<textarea id="message" name="message"></textarea>
我需要获取 textarea 的值并跟踪消息内容并提取散列 (#) 的关键字。
当我点击提交按钮时。我应该得到的关键字是'lol'和'haha'和'message'。
我正在使用 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
或者使用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);
注意:以上所有Array
方法都需要在 ECMA5 之前的浏览器上使用 shim,可在其各自的 MDN 页面上找到或使用es5_shim
如果您愿意,其他替代方案将是使用Array.prototype.forEach
(这将需要一个 shim),for
或while
执行元素和相关元素的Array.prototype.slice
循环Array.prototype.push
。
// 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);
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/
您可以使用一个简单的正则表达式:\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]);
}
使用像with一样的RegExp,即空格或行首,然后是 ,然后是非空格。/(?:\s|^)#([^\s]+)/g
String.prototype.match
#
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
在函数中或只保留字符串的另一个副本)。
在字符串上使用.split('#')
以获取单词数组,然后.trim()
在每个项目上使用以消除空格。