Как тянуть @упоминает из строк, как твиттер в javascript

Я пишу приложение в Node.js, которое позволяет пользователям упоминать друг друга в таких сообщениях, как в твиттере. Я хочу иметь возможность найти пользователя и отправить ему уведомление. Для этого мне нужно вытащить @usernames, чтобы найти упоминания из строки в Node.js?

Любые советы, регулярное выражение, проблемы?

Ответ 1

Я обнаружил, что это лучший способ найти упоминания внутри строки в javascript.

var str = "@jpotts18 what is up man? Are you hanging out with @kyle_clegg";
var pattern = /\[email protected][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}]|:\/\/)/);

Пожалуйста, дайте мне знать, если вы использовали что-либо более эффективное или точное. Спасибо!

Ответ 2

В 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"]

Ответ 3

вот как вы извлекаете упоминания из заголовка instagram с помощью JavaScript и подчеркивания.

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