文字列にWordが含まれているかどうかを確認するjQuery

私はユーザー名をクリックして返信リストに追加することができるアプリケーションに取り組んでいます。 ユーザー名がすでに追加されている場合は、ユーザー名が再度追加されません。 私が抱えている問題は、ユーザー@assassinが追加され、ユーザー@assを追加しようとすると、@ ass-assinが見つかり、既に@assが追加されていると考えられるということです。 ここに私のコードです:

$('#mentions a.mention_user').live('click', function(e){if($('textarea#message').val().toLowerCase().search('@'+$(this).text().toLowerCase()) < 0){
        $('textarea#message').val('@'+$(this).text()+' '+$('textarea#message').val());
    }
    e.preventDefault();
});

前もって感謝します!

編集:ユーザー名と一致するテキストは次のようになります。@user @joe @adamこれはメッセージです@誰か

1
あなたはあなたの質問に答えをコピーする必要はありません。答えを受け入れたら、それはいつも質問の直後に現れます。
追加された 著者 nnnnnn,
あなたは "全単語"や "全ユーザ名"検索を行う必要がありますので、部分一致と一致しないようにしてください。あなたのデータがあなたの探しているもののように見えるかどうかわからないので、それを行うための最良の方法を推薦することは少し難しいです。
追加された 著者 jfriend00,
@ jfriend00完了。
追加された 著者 skimberk1,
質問にコピーを入れたのは、Andy Bairdが提供したバージョンに小さな誤りがあったためです。他の誰かがエラーのある回答を使用しないようにしました。答えが修正されましたので、質問から削除します。
追加された 著者 skimberk1,

4 答え

空白文字がユーザ名に対して不正であると仮定します。 textareaメッセージ文字列をスペースで区切られた配列に分割し、提案されたユーザー名に対して各配列要素をチェックします。

$('#mentions a.mention_user').live('click', function(e) { 
    if ($.inArray('@'+$(this).text(),$('textarea#message').val().split(' '))) { 
        $('textarea#message').val('@'+$(this).text()+' '+$('textarea#message').val()); 
    }
    e.preventDefault(); 
});
2
追加された
クール - 正しいバージョンを表示するために私の答えを編集しました。
追加された 著者 Andy Baird,
素晴らしい、素晴らしい作品。あなたは2つの小さなエラーをしました。正しいバージョンが質問に追加されました。
追加された 著者 skimberk1,

追加するアイテムの長さを、一致するアイテムの長さと比較します。長さが等しい場合、追加されている項目はすでにそこにあります。

0
追加された
私は一致したアイテムの長さだけを測定するので、長さは常に同じになります。希望は意味をなさない。
追加された 著者 skimberk1,

セパレータが常に空白文字であると仮定すると、これを行うことができます:

$('#mentions a.mention_user').live('click', function(e){
   var taMsg = $('#message'),
       userName = '@'+$(this).text()+' ';
   if( (taMsg.val().toLowerCase() + ' ').indexOf(userName) != -1) {
      taMsg.val(userName + taMsg.val());
   }
   e.preventDefault();
}); 

アイデアは、ユーザー名のリストの末尾にスペースを追加した後、スペースの後に特定のユーザー名を検索することができます。

また、メッセージテキストエリアのjQueryオブジェクトを3回繰り返すのではなく、キャッシュするようにコードを更新しました。 '#message'のようなidを使って選択した場合(idが一意であるとすると)、 'textarea'プレフィックスは必要ありません。

また、実際には正規表現を使用していないので、私は .search()の代わりに .indexOf()に切り替えました。

0
追加された

あなたの完全なコードなしでテストするのは難しいですが、正規表現で検索し、トリックをした後にA-Z、a-z、0-9(および他の有効なユーザー名文字ではない)文字があることを確認してください。

何かのようなもの:

$('#mentions a.mention_user').live('click', function(e){if(($('textarea#message').val().toLowerCase() + ' ').search(
    new RegExp("'@'+$(this).text().toLowerCase() + '[^A-Za-z0-9\-_]')
) < 0){
        $('textarea#message').val('@'+$(this).text()+' '+$('textarea#message').val());
    }
    e.preventDefault();
});
0
追加された
@ skimberk1 - SpoonNZは「検索する前にソース文字列に1つの[区切り文字を追加する」と言っています。
追加された 著者 nnnnnn,
答えをありがとう、私はそれをテストします。
追加された 著者 skimberk1,
私はそれについて考えましたが、それが最後のユーザー名だった場合、後で何も持っていないとうまくいかないでしょう。
追加された 著者 skimberk1,
私はそれが動作すると思う、その部分に気づかなかった。
追加された 著者 skimberk1,
それ以外の方法は、セパレータで検索することです(例: "@assassin"または "@assassin"または "@assassin;"を検索してください。明らかに、一貫した区切り記号がある場合にのみ動作し、検索する前にソース文字列に1を付加します。
追加された 著者 SpoonNZ,
JavaScript - 日本のコミュニティ
JavaScript - 日本のコミュニティ
2 参加者の

日本人コミュニティのjavascript