1

我需要匹配所有没有 RT 的提及。我试过添加!否定 rt 但不工作。

preg_match( '/\b!rt\s*@([a-zA-Z0-9_]{1,20})/i', $string, $data );

这必须匹配:'hello @user 你好吗'。
这不是:'RT @user 你好吗'

我不是试图提取用户名或其他东西,我需要知道文本是否有@user 而没有 RT。

有任何想法吗?

4

3 回答 3

3

!不会在正则表达式中“否定”。匹配文字!. 你想要的是“消极的后视”。

/(?<!RT)\s@([a-z0-9]{1,20})/i

(?<!RT)意思是“前面没有“RT”。

这将匹配用户名,“RT”不包含在匹配项中。

$match = preg_match('/(?<!RT)\s@([a-z0-9]{1,20})/i', $string);

如果$match0,则表示字符串为“RT @user ...”。如果$matchis not 0,则表示该字符串不是以“RT @user”开头。

演示:http: //ideone.com/bOWbu

有关正则表达式外观的更多信息:http ://www.regular-expressions.info/lookaround.html

于 2012-05-24T16:22:20.030 回答
0

如果您只想匹配用户名,您可以尝试/(?<!RT)(@.*?)(?=\s)/i

于 2012-05-24T16:25:52.980 回答
0

我相信这应该这样做:

$string1 = 'hello @user how are you';
preg_match('~\s?(?<!RT) @[a-z0-9]+~i', $string1, $data);
print_r($data);
// array('0' => '@user');

$string2 = 'RT @user how are you';
preg_match('~\s?(?<!RT) @[a-zA-Z0-9]+~', $string2, $data);
print_r($data);
// empty array
于 2012-05-24T16:33:32.127 回答