2014-02-12 62 views
0

我需要更換包含在PHP中@符號帶有鏈接的話替換字符串的話用@符號開始

如:

$string = "you would love this @matt"; 

會變成「you would love this <a href="/user/matt">@matt</a>

從研究我需要使用preg_replace(),但不知道從哪裏開始。有任何想法嗎? 感謝

回答

2

Example

$string = "you would love this @matt"; 
$pattern = '/(^|\W)(@([a-zA-Z]+))/'; 
$replacement = '$1<a href="/user/$3">$2</a>'; 
echo preg_replace($pattern, $replacement, $string); 
+0

馬特,每組括號都被分配一個數字。第一組(\ s?)查找可選空間並存儲在$ 1中。第二和第三組是相同的,除了#2將在它前面具有'@'符號。 $ 2將包含'@ matt',$ 3將包含'matt'。然後,他只需要拿出每一部分,並組裝你想要構建的URL字符串。 – Quixrick

+0

這個答案很完美,無論如何我可以確保@符號之前有一個空格嗎? –

+0

@MattEllwood:我只是用更好的方式更新了模式。如果你只是確保@符號之前有一個空格,它將不匹配字符串'@matt would love this'。相反,將模式中的'\ s?'改爲'^ | \ W'。如果它位於字符串的開頭('^'),或者它的前面是一個非單詞字符('\ W'),就會發現它。這樣,如果@符號位於單詞的開頭,它將匹配,但如果它位於單詞的中間(如電子郵件地址)則不匹配。 – Travesty3

2

您可以使用preg_replace_callback()爲:

echo preg_replace_callback('/(?<=\s)@(\w+)/', function($match) { 
    return sprintf('<a href="/user/%s">@%s</a>', 
     urlencode($match[1]), 
     $match[1] 
    ); 
}, htmlspecialchars($string)); 

這樣做可以讓你做應用其他格式的每場比賽。