你已经有了答案。这只是为了比在 cmets 中更好地解释您的假设错误。
$1 不是第一个参数的结果,它是preg_replace 本身仅使用的占位符。您的使用还调用命令优先级。
换句话说,如果你试试这个代码:
$text = 'Lorem test8 Dolor';
function test( $arg ) { echo $arg.PHP_EOL; }
$text = preg_replace('/test([0-9]+)/i', test("$1"), $text);
echo $text;
你得到这个输出:
$1
Lorem Dolor
如你所见,first 参数被求值,then 结果被preg_replace 使用:test() 函数接收字面意思是$1(在与您的数组相同),而不是preg_replace 检索到的8;然后 preg_replace 用第二个参数返回的值替换匹配的子字符串:在上面的情况下,test() 什么都不返回,所以替换什么都没有。
使用此代码:
function test() { return '[$1]'; }
$text = preg_replace('/test([0-9]+)/i', test(), $text);
得到的字符串是:
Lorem [8] Dolor
因为test()返回[$1],preg_replace可以使用它来执行替换。
在您的具体情况下,只有当您遇到这样的情况时才会发生替换:
$array["$1"] = 'Ipsum';
$text = preg_replace('/test([0-9]+)/i', $array["$1"], $text);
最后的文字是:
Lorem Ipsum Dolor
这不是你想要的结果,但是——如前所述——你已经有了答案......