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

时间:2013-06-18 18:43:41

标签: javascript jquery

我有以下textarea代码。

<textarea id="message" name="message"></textarea>

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

示例如果消息如下

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

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

我正在使用jquery。谁能给我一些关于如何去做的建议?

6 个答案:

答案 0 :(得分:3)

根据评论,在空白处拆分,然后通过检查第一个字符来使用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相关元素。

答案 1 :(得分:1)

// 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);

答案 2 :(得分:1)

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/

答案 3 :(得分:1)

使用RegExp /(?:\s|^)#([^\s]+)/gString.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或只保留字符串的另一个副本)。< / p>

答案 4 :(得分:1)

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

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

如果需要,请删除#

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]);
}

答案 5 :(得分:-2)

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