如何解决Preg替换问题与转义字符



我正在使用preg_replace函数来获取重定向网址。但它没有正确更换。

我正在尝试下面的代码

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

预期输出为

AcmeBlogControllersHome::hello1 

但获得输出是

AcmeBlogControllers$1::hello1

使用 preg_quote((

法典:

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

结果:

AcmeBlogControllersHome::hello1

注意:

这不是一个有效的路径:

'AcmeBlogControllers$1::$2';

因为反斜杠需要使用另一个反斜杠转义这是在字符串级别。如果要创建一个包含单个反斜杠的字符串,则需要放置其中两个。

$singleBackslash = '\';

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

$singleBackslash = '';

因为反斜杠逃脱了结尾'

如果你想在正则表达式中使用反斜杠,那么你需要再次转义它,这就是为什么我在已经转义的反斜杠上使用 preg_quote(( 的原因。

您拥有的模式中的所有反斜杠都必须加倍,因为替换模式中的反斜杠被视为特殊字符:它转义美元符号,因此如果数字出现在$之后,则无法将其解析为反向引用。

所以,你所需要的只是

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

请参阅 PHP 演示:

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

输出:

AcmeBlogControllersHome::hello1

最新更新