2013-07-29 85 views
0

我有一個這樣的字符串轉換成我的網頁的PHP:找到字符串中的所有字符串,並使用它

$string = 'this is a test for @john and I can do all @mike'; 

我想借這個字符串發現它裏面的所有字符串@後,並用它來找到與該用戶ID的用戶名是否存在,並轉換成一個鏈接,成爲這樣的事情:

$string = 'this is a test for <a href="/user?id=111">@john</a> and I can do all <a href="/user?id=112">@mike</a>'; 

如何採取所有字符串,並用它來尋找用戶,並替代原字符串後的ID一條鏈接?

我知道使用preg_match我可以把它裏面的字符串,但如何使用這個字符串?和如何構建這個表達式取@之後的名字?

感謝

+0

'preg_match_all'獲取所有的'@'標記,然後創建一個替換數組使用'str_replace' – DevZer0

回答

1

如果你有一個函數,也就是說,link(),這需要字符串john,並返回相應的鏈接:

preg_replace_callback('/@(\w+)/', function($matches) { 
    return link($matches[1]); 
}, $string); 

或者,對於較老的PHP版本:

preg_replace('/@(\w+)/e', 'link(\'$1\')', $string); 
+0

好吧,但我必須找到用戶的動態ID我不知道哪個用戶我有「標記」我想要採取字符串後@做一個查詢foreach匹配,檢索它的id和aftyer完全替換成字符串 –

+0

@AlessandroMinoccheri。 'link()'將以'john'作爲參數來調用。你可以使用'john'找出你需要查找的東西,進行數據庫查詢等,並返回鏈接。 – rid

+0

並在你的函數裏面函數返回之前我必須做查詢嗎?我不明白如何創建一個鏈接,因爲我必須從數據庫@rid –

0
$string = 'this is a test for @john and I can do all @mike'; 
$result = preg_replace('/([^@]+)([^\s]+)/simx', '$1<a href="yourlink">$2</a>', $string); 

echo $result; 

輸出

this is a test for <a href="yourlink">@john</a> and I can do all <a href="yourlink">@mike</a> 
+0

不,我的鏈接是在匹配後採取的,因爲我不知道用戶的ID後,我@首先要把所有匹配的用戶,取其每一個ID和替換後的鏈接 –

1

我會用preg_match_all下面的代碼將字符串以@ begining提取的每一個字,並返回到名爲$matches的數組。然後,您可以循環查看數組並對其進行調整以適合您的需求。

$string = 'this is a test for @john and I can do all @mike'; 

preg_match_all('/(?!\b)(@\w+\b)/', $string, $matches); 
0

我會利用preg_match_all()功能。

之後,我會遍歷匹配並檢索它們的ID,併爲每個匹配生成適當的鏈接,將它們存儲在一個數組中,我們將其稱爲$links

在這一點上我想有兩個數組:

  1. $matches - 這將包含我的模式
  2. $links的所有出現 - 這將包含在1-1對應的所有相應的鏈接。

最後,我會以下列方式使用preg_replace()

preg_replace($matches, $links, $initial_string);

這將$matches,在$initial_string$links相應的項目找到替代的每個項目。

我希望我幫你。也許以後我可以提供一些代碼。

相關問題