匹配模式并用PHP中的count替换

时间:2012-11-16 14:15:51

标签: php preg-replace preg-match

我如何获得模式匹配的计数,然后用计数替换模式。

我试图匹配的模式都是字符串中的bbcode样式标记。

例如:这是[蓝色]文本[/蓝色]的一段,其中所有单词都是[蓝色] [/蓝色]。

我需要在发生时用一个数字和附加文本替换每个标记, 如[@@ 1 @@]和[@@ 2 @@]

我知道我可以将模式与preg_match('/ [blue](。*?)[/ blue] / i',$ string)匹配,甚至可以替换preg_replace

但是我怎样才能使用这些函数中的任何一个获得计数然后将匹配替换为它的计数位置?

2 个答案:

答案 0 :(得分:1)

您可以使用$ matches param。

int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )

如果你通过$matches,它将返回一个包含所有结果的数组。使用count($matches)返回计数!

编辑: 获得$ matches数组后,您可以使用数组的键作为计数值替换它们。

foreach($matches as $k=>$mat){
preg_replace ( /*same pattern*/,"[@@".$k."@@]", /* same subject */,1); //fourth param is to replace only one!
}

试试这个!

EDIT2:正确是preg_replace而不是preg_match(在我的编辑中)。

答案 1 :(得分:1)

尝试preg_replace_callback:

$result = preg_replace_callback('/(\[blue\])([\[]*)(\[\/blue\])/i', function ($matches) {
    static $incr = 0;
    ++$incr;
    return '[@@'.$incr.'@@]'.$matches[2].'[@@'.$incr.'@@]';
}, $text);

有关该

的更多信息,请参阅manual