在preg_replace替换参数中使用替换模式

时间:2014-03-05 22:28:11

标签: php regex

我正在尝试使用PHP的preg_replace将每种#CODE-123种令牌替换为/CODE-123

除了最后一个细节之外,它的效果非常好,我第二次使用它时需要从字符串中删除#,但我无法弄清楚如何。

这是我到目前为止所拥有的:

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

它有效并将#CODE-123替换为[#CODE-123](/#CODE-123),但我需要它[#CODE-123](CODE-123)

有什么想法吗?谢谢!

1 个答案:

答案 0 :(得分: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)