以下两个代码给出了相同的结果:
$test = "this is a test";
echo preg_replace('/a (test)/','\1',$test); //this is test
$test = "this is a test";
echo preg_replace('/a (test)/',"$1",$test); //this is test
但以下两个代码给出了不同的结果:
$test = "this is a test";
echo preg_replace('/a (test)/',md5('\1'),$test); //this is b5101eb6e685091719013d1a75756a53
$test = "this is a test";
echo preg_replace('/a (test)/',md5("$1"),$test); //this is 06d3730efc83058f497d3d44f2f364e3
这是否意味着\ 1和$ 1不同?
答案 0 :(得分:3)
这些都不符合你的要求。在您的代码中,md5
函数在文字字符串'\1'
或"$1"
上调用(反斜杠和美元符号之间的差异是校验和中的差异),然后是{{1}传递了preg_replace
调用的结果,它从来没有机会考虑它尝试匹配的字符串。
在这种情况下,您需要使用preg_replace_callback
:
md5
传递给回调函数的参数是一个包含捕获的子表达式的数组,因此echo preg_replace_callback('/a (test)/', function($m) { return md5($m[1]); }, $test);
或\1
的等价物是$1
; $m[1]
或\2
将为$2
等。
答案 1 :(得分:0)
那是因为你没有再将\1
或$1
传递给preg_replace
来电,是吗?
\1
和$1
在正则表达式替换字符串中是同义词。