首页 > 解决方案 > 如何使用转义字符修复 Preg 替换问题

问题描述

我正在使用 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

标签: phppreg-replace

解决方案


使用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() 的原因。


推荐阅读