2014-03-05 91 views
0

我試圖使用PHP的preg_replace來替換每個#CODE-123種類的令牌到/CODE-123在preg_replace替換參數中使用替換模式

它工作得很好,除了最後一個細節,我需要從字符串中刪除#第二次使用它,但我不知道如何。

這是我到目前爲止有:

echo preg_replace('/#.*-[0-9]*/i', '[${0}](/${0})', $this->description); 

它的工作原理,並替換#CODE-123 [#CODE-123](/#CODE-123)但我需要它是[#CODE-123](CODE-123)代替。

有什麼想法?謝謝!

+1

kingkero有答案。作爲旁白的評論,我建議你用更明確的東西替換'。*',這會減少正則表達式引擎的工作並避免可能的錯誤。 –

回答

2

如果組是(用括號(..)),你可以解決各自獨立地發現

echo preg_replace('/#(.*-[0-9]*)/i', '[${0}](${1})', $this->description); 

整個模式將始終0(你已經使用)的認可,並通過第一組1等。您可能需要添加?以使圖案不太貪婪。

目前,它的工作原理是這樣的:

$text = "hello world #ACODE-123 blabla #BCODE-233"; 
echo preg_replace('/#(.*-[0-9]*)/i', '[${0}](${1})', $text); 
//hello world [#ACODE-123 blabla #BCODE-233](ACODE-123 blabla #BCODE-233) 

這是最有可能不是想要的結果(但有效!)。

$text = "hello world #ACODE-123 blabla #BCODE-233"; 
echo preg_replace('/#(.*?-[0-9]*)/i', '[${0}](${1})', $text); 
       //  ^-- this is new 
//hello world [#ACODE-123](ACODE-123) blabla [#BCODE-233](BCODE-233)