我在preg_replace()
内有一个函数。
我正在使用它:
$pattern[] = "/\[test\](.*?)\[\/test\]/is";
$replace[] = $this->test('$1');
$content = preg_replace($pattern, $replace, $content);
然后函数test()
打印出发送给它的值。
但价值始终只是$1
,而应该是来自[test]...[/test]
的内容。
任何想法如何做到这一点?
答案 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
中存储的正则表达式捕获值解释为其值