19

私はNode.jsで、ユーザーがTwitterのようなメッセージでお互いに言及できるようにするアプリケーションを書いています。ユーザーを見つけて通知を送信できるようにしたい。これを行うには、@ usernamesをプルして、node.jsの文字列からメンションを見つける必要がありますか?

アドバイス、正規表現、問題はありますか?

4

3 に答える 3

47

これがjavascriptの文字列内の言及を見つけるための最良の方法であることがわかりました。

var str = "@jpotts18 what is up man? Are you hanging out with @kyle_clegg";
var pattern = /\B@[a-z0-9_-]+/gi;
str.match(pattern);
["@jpotts18", "@kyle_clegg"]

(@ j.potts)のようなユーザー名と混同される可能性のあるピリオドを避けるために、意図的に大文字と小文字の英数字と(-、_)記号に制限しました。

これは、twitter-text.jsが舞台裏で行っていることです。

// Mention related regex collection
twttr.txt.regexen.validMentionPrecedingChars = /(?:^|[^a-zA-Z0-9_!#$%&*@@]|RT:?)/;
twttr.txt.regexen.atSigns = /[@@]/;
twttr.txt.regexen.validMentionOrList = regexSupplant(
    '(#{validMentionPrecedingChars})' +  // $1: Preceding character
    '(#{atSigns})' +                     // $2: At mark
    '([a-zA-Z0-9_]{1,20})' +             // $3: Screen name
    '(\/[a-zA-Z][a-zA-Z0-9_\-]{0,24})?'  // $4: List (optional)
  , 'g');
twttr.txt.regexen.endMentionMatch = regexSupplant(/^(?:#{atSigns}|[#{latinAccentChars}]|:\/\/)/);

より効率的または正確なものを使用したことがあるかどうかをお知らせください。ありがとう!

于 2013-03-07T07:39:19.900 に答える
6

Twitterには、これに使用できるはずのライブラリがあります。https://github.com/twitter/twitter-text-js

私はそれを使用していませんが、その説明を信頼するなら、「ライブラリは、URL、ユーザー名、リスト、およびハッシュタグの自動リンクと抽出を提供します。」Nodeで。を使用して使用できるはずですnpm install twitter-text

Twitterのユーザー名を探していないことは理解していますが、同じロジックが適用され、問題なく使用できるはずです(抽出されたユーザー名が有効なTwitterのユーザー名であることは検証されません)。そうでない場合は、自分の目的のためにフォークすることから始めるのが非常に良いでしょう。

編集:私はドキュメントを詳しく調べました、そしてあなたがここに必要なものの完璧な例があります。

var usernames = twttr.txt.extractMentions("Mentioning @twitter and @jack")
// usernames == ["twitter", "jack"]
于 2013-03-07T17:54:26.367 に答える
0

JavaScript とアンダースコアを使用して、instagram のキャプションからメンションを抽出する方法を次に示します。

var _ = require('underscore');

function parseMentions(text) {
    var mentionsRegex = new RegExp('@([a-zA-Z0-9\_\.]+)', 'gim');

    var matches = text.match(mentionsRegex);
    if (matches && matches.length) {
        matches = matches.map(function(match) {
            return match.slice(1);
        });
        return _.uniq(matches);
    } else {
        return [];
    }
}
于 2015-09-10T12:30:22.830 に答える