2012-05-24 100 views
1

我需要在沒有RT的情況下匹配所有提及。我試過添加!否定rt但不工作。正則表達式提及

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

這必須匹配:'你好@user你好嗎'。
這不是:'RT @user你好嗎'

我不試圖提取用戶名或什麼的,我需要的是要知道文本是否沒有RT的@user。

任何想法?

+0

你想匹配什麼?只是'@ user'?或整個字符串。 –

+0

我想知道文本是否具有此結構[at]沒有RT的用戶來過濾它。 – greenbandit

回答

3

!在正則表達式中不會「否定」。這符合文字!。你想要的是一個「負面的看法」。

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

(?<!RT)裝置RT「不前面有 「」。

這將匹配的用戶名中, 「RT」 不包括爲匹配。

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

$match如果是0 ,這意味着該字符串是「RT @user ...」,如果$match不是0,則表示該字符串確實是而不是以「RT @user」開頭

DEMO:http://ideone.com/bOWbu

對正則表達式lookarounds更多信息:http://www.regular-expressions.info/lookaround.html

+0

這是行不通的,當RT在前面時,趕上[at]用戶 – greenbandit

+0

@火箭我想他想抓住「你好」而不是「RT」。他有這樣一個老問題並將其刪除。 –

+0

@火箭我想知道文本是否具有此結構[at]用戶沒有RT過濾它。 – greenbandit

0

如果你只是想匹配的用戶名,你可以嘗試/(?<!RT)(@.*?)(?=\s)/i

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 
+0

兩個示例都返回:Array ( [0] => @user ) – greenbandit

+0

糟糕!編輯我的答案。 – mpratt