0

我在preg_replace().

我这样使用它:

$pattern[] = "/\[test\](.*?)\[\/test\]/is";
$replace[] = $this->test('$1');

$content = preg_replace($pattern, $replace, $content);

然后该函数test()打印出发送给它的值。但价值永远是公正的$1,而它应该是来自的内容[test]...[/test]

任何想法如何做到这一点?

4

3 回答 3

3

如果您希望将匹配项替换为$this->test具有第一个子模式的相应匹配字符串的方法的返回值,则需要使用preg_replace_callbackand 包装函数:

$pattern = "/\[test\](.*?)\[\/test\]/is";
$replace = function($match) use ($this) { return $this->test($match[1]); };
$content = preg_replace_callback($pattern, $replace, $content);
于 2013-02-17T17:59:26.233 回答
3

test()永远不会收到 的值$1,它总是会得到文字字符串"$1"。当您这样做时$this->test(),您调用该test()函数,它接收您放在括号中的内容作为参数。

test()执行时,正则表达式尚未计算。你必须这样做:

$pattern = "/\[test\](.*?)\[\/test\]/is";
$content = $this->test( preg_replace( $pattern, '$1', $content));

这将导致test()接收 的值$1。否则,您需要preg_replace_callback()

$pattern[] = "/\[test\](.*?)\[\/test\]/is";
$content = preg_replace($pattern, function( $match) { 
    return $this->test( $match[1]); 
}, $content);
于 2013-02-17T17:57:37.673 回答
-2

单引号表示文字字符串。

所以'$1'会回来$1

while"$1"会将存储的正则表达式捕获的值解释$1为其值

于 2013-02-17T17:54:49.267 回答