1

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

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

例如:这是一段 [blue]text[/blue],其中所有单词都是 [blue]color[/blue]。

我需要用数字和其他文本替换每个标签,例如 [@@1@@] 和 [@@2@@]

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

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

4

2 回答 2

1

尝试 preg_replace_callback:

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

有关详细信息,请参阅手册

于 2012-11-16T15:45:35.223 回答
1

您可以使用 $matches 参数。

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 (在我的编辑中)。

于 2012-11-16T14:21:34.477 回答