2013-05-02 96 views
0

我正在使用提及系統,並且遇到了一個問題,當我循環並將提到的鏈接更改爲鏈接時,它將使用相同的鏈接替換類似的@tom和@ tom123到/湯姆/而不是個人。preg_replace具有相似的值

我已經嘗試過使用正則表達式和preg_replace,但是我也檢查,如果用戶名實際存在,所以我只是想知道如果有一種方法,我可以防止它發生。

$tweet = "@wayne how are you? @wayne123 is cool but are you?"; 

     preg_match_all('/(^|\s)@([a-z0-9_]+)/i', $tweet, $matches); 
     $i = 0; 

     foreach($matches[2] as $value) 
     { 

      if ($db_query) 
      { 
       $tweet = str_replace("@" . $value, "<a href=\"/user/$value\">@$value</a>!", $tweet); 
      }    
     } 

     echo $tweet; // outputs: hi <a href="/user/wayne">@wayne!</a> how are you? <a href="/user/wayne">@wayne!</a>123 is cool but are you? 

任何幫助是極大的讚賞,我已經和正則表達式嘗試過,但沿線仍在繼續,我甚至可以檢查,看看他們是否是一個有效的用戶

+0

你能後的代碼爲你的'$ db_query'? – Drewness 2013-05-02 14:17:06

回答

0

問題之前更新他人是第一次通過循環@ wayne123被@wayne替換,因此無法通過循環第二次找到匹配。使用preg_replace帶回引用。

$tweet = "@wayne how are you? @wayne123 is cool but are you?"; 
$pattern = '/(^|\s)@(\w+)/'; 
$replacement = '<a href="/user/$2">@$2</a>'; 
print preg_replace($pattern, $replacement, $tweet); 
$replacement$2

被替換爲第二盤比賽括號的(\w)

注意(\w)([a-zA-Z0-9_])

+0

是的,然而,即使用戶名不存在,這個代碼也會改變它們,這就是我最初的做法 – 2013-05-02 15:15:48

+1

好吧,我現在看看'if($ db_query)'是什麼。在這種情況下,將'str_replace(「@」。$ value,'替換爲'preg_replace('/@'.$ value。'\ b /','\ b定義一個字邊界,因此@wayne不會匹配@ wayne123 – RMcLeod 2013-05-02 15:22:50

+0

對不起,我沒有在那裏添加太多的細節!db_query本質上檢查是否存在名稱,謝謝你現在很好地工作 – 2013-05-02 15:27:17

0

添加一個空格速記?

$tweet = str_replace("@" . $value." ", "<a href=\"/user/$value\">@$value</a>! ", $tweet); 

的preg_replace更加有用

+0

雖然它的工作,它不是理想的,如果標籤放在消息的結尾?我同意preg_replace更有用,但讓它工作,我想要它是一個真正的痛苦! – 2013-05-02 15:20:42

2

我認爲不是:

$鳴叫= str_replace函數( 「@」 $價值 「!@ $價值」,$鳴叫);

你應該使用:

$tweet = preg_replace('/@' . $value.'\b/', "<a href=\"/user/$value\">@$value</a>!", $tweet);