如何使用转义符修复Preg替换问题

时间:2019-04-01 14:57:35

标签: php preg-replace

我正在使用preg_replace函数来获取重定向URL,但是它不能正确替换。

我正在尝试使用以下代码

$key = 'acme/(.*)/(.*)';
$val = '\Acme\Blog\Controllers\$1::$2';
$uri = 'acme/Home/hello1';
$redirect = preg_replace('#^' . $key . '$#', $val, $uri);

预期输出为

\Acme\Blog\Controllers\Home::hello1 

但获得输出是

\Acme\Blog\Controllers$1::hello1

2 个答案:

答案 0 :(得分:0)

使用preg_quote()

  

代码:

$key = 'acme/(.*)/(.*)';

$val = preg_quote('\\Acme\\Blog\\Controllers\\') . '$1::$2';
$uri = 'acme/Home/hello1';
$redirect = preg_replace('#^' . $key . '$#', $val, $uri);

echo $redirect;
  

结果:

\Acme\Blog\Controllers\Home::hello1
  

注意:

这不是有效的路径:

'\Acme\Blog\Controllers\$1::$2';

因为反斜杠\需要与另一个反斜杠\一起转义,所以这是在字符串级别。如果要创建包含单个反斜杠的字符串,则需要放置两个反斜杠。

$singleBackslash = '\\';

由于反斜杠被视为转义代码,这将为您解析错误:

$singleBackslash = '\';

因为反斜杠转义了结尾'

如果要在正则表达式中使用反斜杠,则需要再次对其进行转义,这就是为什么我对已经转义的反斜杠使用preg_quote()的原因。

答案 1 :(得分:0)

您必须将模式中的所有反斜杠加倍,因为替换模式中的反斜杠被视为特殊字符:它转义了美元符号,因此,如果数字node -r path/to/my/script.js dist/main.js之后不能将其解析为反向引用

所以,您需要的只是

\$

请参见PHP demo

preg_replace('#^' . $key . '$#', str_replace('\\', '\\\\', $val), $uri)

输出:

$key = 'acme/(.*)/(.*)';
$val = '\Acme\Blog\Controllers\$1::$2';
$uri = 'acme/Home/hello1';
$redirect = preg_replace('#^' . $key . '$#', str_replace('\\', '\\\\', $val), $uri);
echo $redirect;