我在preg_replace()
.
我这样使用它:
$pattern[] = "/\[test\](.*?)\[\/test\]/is";
$replace[] = $this->test('$1');
$content = preg_replace($pattern, $replace, $content);
然后该函数test()
打印出发送给它的值。但价值永远是公正的$1
,而它应该是来自的内容[test]...[/test]
。
任何想法如何做到这一点?
我在preg_replace()
.
我这样使用它:
$pattern[] = "/\[test\](.*?)\[\/test\]/is";
$replace[] = $this->test('$1');
$content = preg_replace($pattern, $replace, $content);
然后该函数test()
打印出发送给它的值。但价值永远是公正的$1
,而它应该是来自的内容[test]...[/test]
。
任何想法如何做到这一点?
如果您希望将匹配项替换为$this->test
具有第一个子模式的相应匹配字符串的方法的返回值,则需要使用preg_replace_callback
and 包装函数:
$pattern = "/\[test\](.*?)\[\/test\]/is";
$replace = function($match) use ($this) { return $this->test($match[1]); };
$content = preg_replace_callback($pattern, $replace, $content);
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'
会回来$1
while"$1"
会将存储的正则表达式捕获的值解释$1
为其值