2

我有以下文本区域代码。

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

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

例如,如果消息如下

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

当我点击提交按钮时。我应该得到的关键字是'lol'和'haha'和'message'。

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

4

6 回答 6

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 之前的浏览器上使用 shim,可在其各自的 MDN 页面上找到或使用es5_shim

如果您愿意,其他替代方案将是使用Array.prototype.forEach(这将需要一个 shim),forwhile执行元素和相关元素的Array.prototype.slice循环Array.prototype.push

于 2013-06-18T18:55:18.087 回答
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);
于 2013-06-18T18:52:55.233 回答
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/

于 2013-06-18T18:53:23.663 回答
1

您可以使用一个简单的正则表达式:\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]);
}
于 2013-06-21T00:25:01.640 回答
1

使用像with一样的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函数中或只保留字符串的另一个副本)。

于 2013-06-18T18:54:02.343 回答
-2

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

于 2013-06-18T18:46:51.607 回答