PHP正则表达式 - $ 1和\ 1之间有什么区别?

时间:2016-05-03 19:33:01

标签: php regex

以下两个代码给出了相同的结果:

$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不同?

2 个答案:

答案 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在正则表达式替换字符串中是同义词。