2013-04-30 31 views
0

這個正則表達式模式讓我感到困惑。PHP正則表達式匹配「@user」任何地方

我有一個用戶名,如@tom存儲在一個變量。我想在字符串中的任何位置找到與@tom匹配的模式;開始,中間或結束。

我的目標是匹配,然後替換爲他的個人資料頁面的鏈接。我想我已經明白了,但它並沒有意識到一個詞的結尾。至於它在什麼時候尋找@tom它也與@tommy相匹配,這不是我想要的。

這是我到目前爲止有:

$pattern = array(); 
$pattern[0] = '/'.$possible1.'/i'; 

$replacement = array(); 
$replacement[0] = '$1<a href="http://banterme.com/'.$possible1user.'">@'.$possible1user.'</a>'; 

echo preg_replace($pattern, $replacement, $text); 

我使用一個數組,因爲我想匹配所有@的文本(例如:@湯姆是@inga),不只是一個。我簡化了實際的代碼,只顯示了數組的一部分。

UPDATE:基本上,我試圖找出'/'.$possible1.'/i'應該是不匹配(例如)@tom@tommy

+2

使用前瞻斷言:'@tom(?!\ w)'這將匹配@tom,後面沒有'\ w' aka'[a-zA-Z0-9_]' – HamZa 2013-04-30 21:35:47

+1

@HamZaDzCyber​​DeV這工作。如果它不作爲評論,我會將其標記爲解決方案。 – Tom 2013-04-30 23:06:01

+1

謝謝^^我願意讓@reikyoushin拿分,所以只要接受他的回答:-) – HamZa 2013-04-30 23:08:05

回答

1

爲什麼不直接使用str_replace?

str_replace ("@tom" , "<a href='/users/tom'>@tom</a>" , $text); 

它聽起來不像你需要這樣的正則表達式。

+0

有了這個,你會得到'@ tommy'也被替換成了'@tom my' – HamZa 2013-04-30 21:39:25

+0

問題是「用戶名像@tom「,我猜會包括像@dave這樣的東西 – 2013-04-30 21:39:26

+0

對不起,我正在尋找一個與'@ tom'和'@ tommy'不匹配的模式。基本上,應該改變'/'.$'possible1。'/ i''。 – Tom 2013-04-30 22:44:33

0

試試這個

$count = null; 
$returnValue = preg_replace('/@([\w]+)[^\w]/', '<href="http://banterme.com/$1">@$1</a> ', '@tom met @dave somewhere', -1, $count);