【问题标题】:how to pull @ mentions out of strings like twitter in javascript如何从 javascript 中的 twitter 等字符串中提取@提及
【发布时间】:2013-02-22 07:43:13
【问题描述】:

我正在用 Node.js 编写一个应用程序,它允许用户在 twitter 等消息中相互提及。我希望能够找到用户并向他们发送通知。为了做到这一点,我需要拉 @usernames 从 node.js 中的字符串中查找提及?

有什么建议、正则表达式、问题吗?

【问题讨论】:

  • 我认为这个是不同的,因为它是特定于一种语言的。我认为人们可以参考那篇文章,但它没有更新为最佳答案。

标签: javascript regex node.js twitter


【解决方案1】:

我发现这是在 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}]|:\/\/)/);

如果您使用了更有效或更准确的方法,请告诉我。谢谢!

【讨论】:

  • 这也将匹配一个@。为防止出现这种情况,您可以将 * 替换为 +
  • yoo 还可以在“@”之前添加一个单词分隔符,以确保您不会意外捕获电子邮件: var str = "@jpotts18 what is up man?你在和@kyle_clegg 一起玩吗,联系我在 foo@bar.com"; str.match(/\B@[a-z0-9_-]+/gi);
  • 提莫西很棒的评论!记住这是一个很好的建议。我将根据您的建议更新我的正则表达式@TimothéeGroleau
  • 好孩子! :D Tnks 提示非常非常有帮助!
  • 嗨,这个模式分割点字符“@this.is.me”只检测到变成“@this”
【解决方案2】:

Twitter 有一个库,您应该可以使用它。 https://github.com/twitter/twitter-text-js.

我没有使用过它,但如果您相信它的描述,“该库为 URL、用户名、列表和主题标签提供自动链接和提取功能。”。您应该可以在带有npm install twitter-text 的 Node 中使用它。

虽然我知道您不是在寻找 Twitter 用户名,但同样的逻辑仍然适用并且您应该能够正常使用它(它不会验证提取的用户名是否是有效的 Twitter 用户名)。如果没有,为你自己的目的分叉它可能是一个很好的起点。

编辑:我仔细查看了文档,有一个完美的例子说明你需要什么here

var usernames = twttr.txt.extractMentions("Mentioning @twitter and @jack")
// usernames == ["twitter", "jack"]

【讨论】:

  • 谢谢尼克。我已经编辑了我的答案以从该库中提取正则表达式。我不知道有 2 个 @ 符号。嗯……
  • 没问题,如果您觉得答案正确,欢迎采纳。你会发生这样的事情,这就是为什么我总是选择使用维护的库来处理这样的事情,而不是自己编写它。这似乎很容易,但是(几乎)没人知道的小事情会导致非常难以发现的错误。
【解决方案3】:

这是您如何使用 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 [];
    }
}

【讨论】:

    猜你喜欢
    • 2012-04-17
    • 2011-10-25
    • 2011-11-13
    • 2019-06-17
    • 2017-07-20
    • 2012-01-12
    • 1970-01-01
    相关资源
    最近更新 更多