Regex Действительный Твиттер Упоминание - PullRequest
9 голосов
/ 22 августа 2011

Я пытаюсь найти регулярное выражение, которое соответствует, если Tweet, это истинное упоминание.Чтобы упомянуть, строка не может начинаться с «@» и не может содержать «RT» (без учета регистра), а «@» должно начинаться со слова.

В примерах я прокомментировал желаемый вывод

Некоторые примеры:

function search($strings, $regexp) {
    $regexp;
    foreach ($strings as $string) {
        echo "Sentence: \"$string\" <- " .
        (preg_match($regexp, $string) ? "MATCH" : "NO MATCH") . "\n";
    }
}

$strings = array(
"Hi @peter, I like your car ", // <- MATCH
"@peter I don't think so!", //<- NO MATCH: the string it's starting with @ it's a reply
"Helo!! :@ how are you!", // NO MATCH <- it's not a word, we need @(word) 
"Yes @peter i'll eat them this evening! RT @peter: hey @you, do you want your pancakes?", // <- NO MATCH "RT/rt" on the string , it's a RT
"Helo!! ineed@aser.com how are you!", //<- NO MATCH, it doesn't start with @
"@peter is the best friend you could imagine. RT @juliet: @you do you know if @peter it's awesome?" // <- NO MATCH starting with @ it's a reply and RT
);
echo "Example 1:\n";
search($strings,  "/(?:[[:space:]]|^)@/i");

Токовый выход:

Example 1:
Sentence: "Hi @peter, I like your car " <- MATCH
Sentence: "@peter I don't think so!" <- MATCH
Sentence: "Helo!! :@ how are you!" <- NO MATCH
Sentence: "Yes @peter i'll eat them this evening! RT @peter: hey @you, do you want your pancakes?" <- MATCH
Sentence: "Helo!! ineed@aser.com how are you!" <- MATCH
Sentence: "@peter is the best friend you could imagine. RT @juliet: @you do you know if @peter it's awesome?" <- MATCH

РЕДАКТИРОВАТЬ:

Мне нужно это в регулярных выражениях, потому что это может бытьиспользуется на MySQL и других языках тоже.Я не ищу ни одного имени пользователя.Я только хочу знать, является ли строка упоминанием или нет.

Ответы [ 5 ]

8 голосов
/ 23 января 2012

Это регулярное выражение может работать немного лучше: /\B\@([\w\-]+)/gim

Вот пример jsFiddle в действии: http://jsfiddle.net/2TQsx/96/

7 голосов
/ 22 августа 2011

Вот регулярное выражение, которое должно работать:

/^(?!.*\bRT\b)(?:.+\s)?@\w+/i

Объяснение:

/^             //start of the string
(?!.*\bRT\b)   //Verify that rt is not in the string.
(?:.*\s)?      //Find optional chars and whitespace the
                  //Note: (?: ) makes the group non-capturing.
@\w+           //Find @ followed by one or more word chars.
/i             //Make it case insensitive.
2 голосов
/ 07 марта 2013

Я обнаружил, что это лучший способ найти упоминания внутри строки в javascript.Я не знаю точно, как бы я сделал RT, но я думаю, что это могло бы помочь с частью проблемы.

var str = "@jpotts18 what is up man? Are you hanging out with @kyle_clegg";
var pattern = /@[A-Za-z0-9_-]*/g;
str.match(pattern);
["@jpotts18", "@kyle_clegg"]
1 голос
/ 22 августа 2011

Я думаю, что-то вроде этого сделает это:

^(?!.*?RT\s).+\s@\w+

Примерно переведено на:

В начале строки посмотрите вперед, чтобы увидеть, что RT \ s нет, затемнайдите один или несколько символов, за которыми следует символ @ и хотя бы одна буква, цифра или подчеркивание.

0 голосов
/ 19 сентября 2014

Twitter опубликовал регулярное выражение, которое они используют в своей библиотеке twitter-text . У них есть и другие языковые версии, опубликованные также на GitHub.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...