2

次のテキストエリアコードがあります。

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

テキストエリアの値を取得し、メッセージの内容を追跡して、ハッシュ (#) されたキーワードを抽出する必要があります。

メッセージが以下の場合の例

これは私のメッセージです #メッセージ #笑 #笑

送信ボタンをクリックすると。ゲットすべきキーワードは「笑」と「はは」と「メッセージ」です。

私は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.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 より前のブラウザーで shim を必要とし、それぞれの MDN ページで利用できるか、es5_shimを使用します。

必要に応じて、その他の代替手段として、Array.prototype.forEach(シムが必要になる)を使用するforか、要素と関連while要素のループを実行します。Array.prototype.sliceArray.prototype.push

于 2013-06-18T18:55:18.087 に答える
1

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

のような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 に答える