2013-03-07 17 views
15

Piszę aplikację w Node.js, która pozwala użytkownikom wymieniać się nawzajem w wiadomościach takich jak na twitterze. Chcę móc znaleźć użytkownika i wysłać mu powiadomienie. W tym celu muszę pobrać @usernames, aby znaleźć wzmianki o ciągu w pliku node.js?jak wyciągnąć @ wzmianki z łańcuchów takich jak twitter w javascript

Wszelkie porady, wyrażeń regularnych, problemy?

+0

Myślę, że ten jest inny, ponieważ jest specyficzny dla danego języka. Myślę, że wspaniale jest, że ludzie odwołują się do tego artykułu, ale nie jest on aktualizowany najlepszą odpowiedzią. – jpotts18

Odpowiedz

34

Odkryłem, że jest to najlepszy sposób na znalezienie wzmianek wewnątrz napisu w 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"] 

I celowo ograniczona do górnej i małe alfanumeryczne i (-, _) symboli w celu uniknięcia okresów, które mogłyby być mylone z nazwy użytkownika, takich jak (@ j.potts).

To właśnie robi twitter-text.js za kulisami.

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

Proszę dać mi znać, jeśli używasz czegoś, co jest bardziej wydajne lub dokładne. Dzięki!

+3

Spowoduje to również dopasowanie pojedynczego znaku '@ '. Aby uniemożliwić zamianę '*' na '+' –

+8

yoo można również dodać separator słów przed '@', aby upewnić się, że przypadkowo nie zaplączymy wiadomości e-mail: var str = "@ jpotts18 co jest człowiekiem? spotykać się z @kyle_clegg, skontaktuj się ze mną pod adresem [email protected] "; str.match (/ \ B @ [a-z0-9 _-] +/gi); –

+1

Świetny komentarz Timothee! To dobra rada, o której należy pamiętać. Zaktualizuję moje wyrażenie na podstawie Twojej sugestii @ TimothéeGroleau – jpotts18

3

Twitter ma bibliotekę, której powinieneś być w stanie użyć do tego. https://github.com/twitter/twitter-text-js.

Nie użyłem go, ale jeśli ufasz jego opisowi, "biblioteka zapewnia autolinking i ekstrakcję dla adresów URL, nazw użytkowników, list i hashtagów.". Powinieneś być w stanie używać go w węźle z npm install twitter-text.

Chociaż rozumiem, że nie szukasz nazw użytkowników na serwerze Twitter, ta sama logika nadal obowiązuje i powinieneś być w stanie używać go dobrze (nie sprawdza, czy wyodrębnione nazwy użytkowników są prawidłowymi nazwami użytkowników Twittera). Jeśli nie, rozwidlenie go dla własnych celów może być bardzo dobrym miejscem do rozpoczęcia.

Edytuj: Spojrzałem na dokumenty bliżej i jest doskonały przykład tego, co jest potrzebne: here.

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

Dzięki nick. Edytowałem swoją odpowiedź, aby pobrać wyrażenie z tej biblioteki. Nie miałem pojęcia, że ​​są 2 symbole @. huh ... – jpotts18

+0

Nie ma problemu, nie wahaj się zaakceptować, jeśli uważasz, że jest to poprawna odpowiedź. I takie rzeczy się zdarzają, dlatego zawsze wolę używać utrzymywanych bibliotek do takich rzeczy, niż samemu pisać.To może wydawać się łatwe, ale małe rzeczy, o których (praktycznie) nikt nie wie, prowadzą do straszliwie trudnych do znalezienia błędów. –

0

Oto jak wydobywasz wzmianki z napisu na Instagramie przy pomocy JavaScript i podkreślenia.

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 []; 
    } 
} 
Powiązane problemy