使用preg_replace逃逸$ 0,$ 1,..

时间:2018-12-02 01:31:52

标签: php regex preg-replace

我有类似的东西:

<?php
$text = 'lorem ipsum';
$pattern = '/lorem/';
$value = 'test $0';

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

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

是否有办法禁用preg_replace()的此功能?

上面的示例当然得到了简化。我实际上是在做一个模板脚本,用文件内容替换占位符,文件内容可以是javascript,html等。因此,最好对preg_replace函数本身起作用,而不是被迫修改所有文件,以确保它们具有转义字符。

谢谢

2 个答案:

答案 0 :(得分:1)

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

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

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

https://3v4l.org/J8aps

答案 1 :(得分:1)

使用preg_quote,它是进行此操作的正确工具:

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

输出:

test $0 ipsum