Preg_replace返回$ 1而不是真实内容

时间:2013-02-17 17:52:01

标签: php regex preg-replace

我在preg_replace()内有一个函数。

我正在使用它:

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

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

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

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

3 个答案:

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

答案 1 :(得分:3)

如果希望匹配被$this->test方法的返回值替换为第一个子模式的相应匹配字符串,则需要使用preg_replace_callback和包装函数:< / p>

$pattern = "/\[test\](.*?)\[\/test\]/is";
$replace = function($match) use ($this) { return $this->test($match[1]); };
$content = preg_replace_callback($pattern, $replace, $content);

答案 2 :(得分:-2)

单引号表示文字字符串。

因此'$1'将返回$1

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