2012-10-02 3 views
1

Я реализую функцию «тип-голова» друзей/последователей, подобную той, что видна на Facebook.Как получить следующие два слова, следующие за «@» в строке с javascript

Когда пользователь вводит ключ «@» в поле комментариев, следующие два слова должны быть проверены на основе json-массива имен пользователей, отображающих список автозаполнения.

У меня уже есть событие, которое запускается, когда пользователь нажимает «@», и затем отправляет полную текстовую строку в отдельную функцию, в которой я намерен выполнить сопоставление. Теперь мне просто нужно разобрать этот текст и получить текст, следующий за «@».

Поэтому вопрос заключается в том, как получить текст, который непосредственно следует за символом «@» внутри строки.

Соответствие должно быть извлечено из Последнее Вхождение строки «@» в строку. (чтобы разрешить множественные автозавершения в пределах той же строки, что и пользовательские типы.)

Надеюсь, кто-то с лучшим пониманием регулярных выражений/манипуляции с JS-строкой может помочь.

Заранее спасибо.

EDIT:

Просто, чтобы добавить некоторые примеры:

@John Smith says hello 

должен вернуться:

John smith says hello OR simply 'John Smith' - Either is okay for this purpose 

однако эта строка:

I was talking to @John Smith and he told me all about @Sarah Smith 

должен возвращать только:

Sarah Smith 
+0

Можете ли вы разместить примерную строку ввода и ваш желаемый результат? – Nelson

+0

, конечно ... Я отредактирую вопрос – gordyr

ответ

2

Это нормально?

txt.substring(txt.lastIndexOf('@')+1).split(' ').slice(0, 2).join(' ') 

Demo

+0

Все хорошие ответы на данный момент спасибо.Я просто делаю некоторые тесты, прежде чем решать, кому я должен дать ответ. – gordyr

+0

Спасибо, dystroy, несколько правильных ответов здесь, но я наградил его за добавление jsFiddle. Огромное спасибо всем. – gordyr

1

Я бы не использовать регулярные выражения, а lastIndexOf

С моей консоли:

var a = "@tony @stark" 
> undefined 
var b = a.lastIndexOf('@') 
> undefined 
a.substr(b, a.length) 
> "@stark" 

Или, если вы предпочитаете

a.substr(b+1, a.length) 
> "stark" 

* Обновление

function getRest(a) { 
    var b = a.lastIndexOf('@'); 
    return a.substr(b+1, a.length); 
} 
getRest('@John Smith says hello') 
> "John Smith says hello" 
getRest('I was talking to @John Smith and he told me all about @Sarah Smith') 
> "Sarah Smith" 
0

Регулярное выражение будет /@(\w+ \w+)[^@]*$/ (знак @, два слова, не следует, не являющимся @ символы до конца строки). Я не уверен, что это быстрее, чем подстроки/разделенные подходы.

var regex = /@(\w+ \w+)[^@]*$/, 
    myString = "@spork and @abe lincoln spam spam spam", 
    match = myString.match(regex)[1]; 
// match == "abe lincoln" 
+0

Это, вероятно, достаточно быстро и, возможно, быстрее, чем использование indexof: regexp сильно оптимизированы в браузерах, особенно если они не являются динамическими. –

+0

@nrabinowitz - Спасибо, это выглядит хорошо, но он возвращает null, если я только положил в firstname, например, только набрав «Joh» вместо «John Smith», и мне нужно, чтобы он отменил матч, даже если только часть Набирается первое слово. – gordyr

+0

, то используйте '/ @ (\ w + (\ w +)?) [^ @] * $ /' – nrabinowitz

Смежные вопросы