用 preg_replace 转义 $0, $1, ..

escape $0, $1, .. with preg_replace

我有类似的东西:

<?php
$text = 'lorem ipsum';
$pattern = '/lorem/';
$value = 'test [=11=]';

$text = preg_replace($pattern, $value, $text);
?>

我希望 $text 的最终值为 'test [=22=] ipsum'。问题是 $0 被解释为变量并替换为 'lorem',所以我得到 'test lorem ipsum'.

有没有办法禁用 preg_replace() 的这个功能?

上面的例子当然是简化了的。我实际上在做的是制作一个模板脚本,我用文件内容替换占位符,可以是 javascript、html 等...所以对 [=25 采取行动会很棒=] 函数本身而不是被迫修改所有文件以确保它们具有转义字符。

谢谢

您可以 preg_replace 对替换值中的任何反向引用进行转义:

<?php
$text = 'lorem ipsum';
$pattern = '/lorem/';
$value = 'test [=10=]';
echo preg_replace($pattern, preg_replace('/$(\d+)/', '\$', $value), $text);

$(\d+) 搜索任何 $,然后搜索一个或多个数字
\$$ 替换为 $,因为第一个 \ 将反斜杠转义为 PHP 的文字。 是第一个捕获组,它是数字。

https://3v4l.org/J8aps

使用 preg_quote,它是该操作的正确工具:

$text = 'lorem ipsum';
$pattern = '/lorem/';
$value = 'test [=10=]';
$text = preg_replace($pattern, preg_quote($value), $text);
echo $text;

输出:

test [=11=] ipsum