PHP preg_match或_replace从字符串中查找子字符串,同时保留匹配项

PHP preg_match或_replace从字符串中查找子字符串,同时保留匹配项,php,regex,string,Php,Regex,String,所以我有一个类似于esk的评论系统,我正在研究,显然我并没有完全考虑它,但是我在目前和可预见的未来被阻止使用我的方法。也就是说 我目前正在使用 $pattern = '/\[@(\w+):(.*)\]/'; $subject = '[@keyword:string]'; preg_match($pattern, $subject, $matches); 从特定图案类型中查找特定信息。这是某种程度上的[@keyword:string],这非常有效。然而,在我的搜索中,我没有意识到我正在使用的字符

所以我有一个类似于esk的评论系统,我正在研究,显然我并没有完全考虑它,但是我在目前和可预见的未来被阻止使用我的方法。也就是说

我目前正在使用

$pattern = '/\[@(\w+):(.*)\]/';
$subject = '[@keyword:string]';
preg_match($pattern, $subject, $matches);
从特定图案类型中查找特定信息。这是某种程度上的[@keyword:string],这非常有效。然而,在我的搜索中,我没有意识到我正在使用的字符串还包含其他内容,比如注释。所以整个字符串看起来像“[@keyword:string]Hello World”`

上面的代码将为我转储一个数组,第一项是我要查找的实际匹配项,第二项是关键字,第二项是字符串。这很好,因为我用它来做别的事情。然而就像我说的,我从来没有补偿过Hello World的部分。我需要做的是与上面非常相似的事情。但是只将helloworld部分作为一个可重用的字符串,因为我打算重新连接这两个字符串。在我的过程完成之后。除此之外,在本例中完成后的过程是用匹配的用户名或基于关键字的图像替换我要查找的模式,然后它会分派一个函数来查找正确的名称,或为图像创建图像标记。这很好,我得到了那个部分,它只是从字符串中剥离模式,所以当我得到名称或图像时,我可以将其重新连接到字符串


希望这是有意义的。

使用以下模式之一:

'/\[@(\w+):(.*?)\]/'

'/\[@(\w+):(.*)\]/U'

注意:PCRE_UNGREEDY

如果所需的模式在字符串中只出现一次,为什么不使用类似$pattern='/.*?\[@\w+:[^\]*\].*/';