2013-03-07 6 views
15

Sto scrivendo un'applicazione in Node.js che consente agli utenti di parlare tra loro in messaggi come su Twitter. Voglio essere in grado di trovare l'utente e inviare loro una notifica. Per fare questo ho bisogno di richiamare @usernames per trovare le menzioni da una stringa in node.js?come tirare @ menzioni di stringhe come Twitter in javascript

Qualche consiglio, regex, problemi?

+0

Penso che questo è diverso perché è specifico di una lingua. Penso che sia fantastico per le persone fare riferimento a quell'articolo, ma non è aggiornato con la migliore risposta. – jpotts18

risposta

34

ho scoperto che questo è il modo migliore per trovare menzioni all'interno di una stringa in 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"] 

ho volutamente limitati a superiore e minuscole alfanumerico e - simboli (, _) al fine di evitare periodi che potrebbero essere confusi per nomi come (@ j.potts).

Questo è ciò che twitter-text.js sta facendo dietro le quinte.

// 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}]|:\/\/)/); 

Per favore fatemi sapere se avete usato tutto ciò che è più efficiente, o accurate. Grazie!

+3

Questo corrisponderà anche a un singolo '@'. Per evitare che tu possa sostituire il '*' con un '+' –

+8

yoo potresti anche aggiungere un delimitatore di parole prima del '@' per assicurarti di non accidentalmente intrappolare le email: var str = "@jpotts18 cosa è l'uomo? uscire con @kyle_clegg, contattami a [email protected] "; str.match (/ \ B @ [a-z0-9 _-] +/gi); –

+1

Ottimo commento Timothee! Questo è un ottimo consiglio da tenere a mente. Aggiornerò la mia espressione regolare in base al tuo suggerimento @ TimothéeGroleau – jpotts18

3

Twitter ha una libreria che dovresti essere in grado di utilizzare per questo. https://github.com/twitter/twitter-text-js.

Non l'ho usato, ma se ci si fida della sua descrizione, "la libreria fornisce l'autolinking e l'estrazione per URL, nomi utente, elenchi e hashtag.". Dovresti essere in grado di usarlo nel nodo con npm install twitter-text.

Pur comprendendo che non siete alla ricerca di nomi utente di Twitter, la stessa logica vale ancora e si dovrebbe essere in grado di usarlo bene (che non convalida che i nomi utente sono estratti i nomi utente di Twitter validi). In caso contrario, la creazione di un binario per i propri scopi potrebbe essere un ottimo punto di partenza.

Edit: ho guardato la documentazione più stretti, e non v'è un perfetto esempio di ciò che è necessario a destra here.

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

Grazie nick. Ho modificato la mia risposta per inserire la regex da quella libreria. Non avevo idea che ci fossero 2 simboli @. huh ... – jpotts18

+0

Nessun problema, sentitevi liberi di accettare se ritenete che sia la risposta corretta. E succede cose del genere, ed è per questo che scelgo sempre di usare una libreria gestita per cose come questa invece di scriverla da sola.Può sembrare abbastanza facile, ma le piccole cose che (praticamente) nessuno sa portano a bug terribilmente difficili da trovare. –

0

ecco come si estrae menziona da instagram didascalia con JavaScript e sottolineatura.

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