为什么要在 preg_replace() 的替换字符串中将反向引用数字括在大括号中?

问题描述 投票:0回答:3

我无法理解这一点:

$string = 'April 15, 2003';
$pattern = '/(\w+) (\d+), (\d+)/i';
$replacement = '${1}1,$3';
echo preg_replace($pattern, $replacement, $string);

输出为

April1,2003
。我不明白这个表达:
$replacement = '${1}1,$3';
如果有人为我澄清,我将不胜感激。

php regex preg-replace
3个回答
2
投票

程序员必须使用这个,因为

$replacement = '$11,$3'; 

会表现得很奇怪和错误。而且,他们无法使用

$replacement = '$1'.'1,$3'; 

也是如此,因为这会导致它被解析为第一个示例。

这就是为什么有这些括号,它们充当变量和数字之间的分隔符

1

相同
$username = "Martin"
$text = "Hello ${username}and welcome";

上面的示例将输出“Hello Martinandwelcome”

但是这个

$username = "Martin";
$text = "Hello $usernameand welcome";

将变量名称与纯文本混淆,这是您的替换项,数字

1


1
投票

${1}
语法引用模式匹配中的第一个捕获组。在这种特殊情况下这是必要的,因为替换的所需输出是第一个捕获组,后跟文字
1

这是 php 在正则表达式上下文中处理反向引用的结果。

${1}
是将反向引用与文字
1
分开所必需的。如果模式是
$11
,php 会认为
$11
是对第十一个捕获组的引用。


1
投票

这里的问题是您事先构造了

$replacement
变量,并且所有字符串连接都发生在调用 preg_replace 之前。举个例子:

假设您有:

$replacement = '$1' . '1';

这将做的是将值

$11
放入变量$replacement中,当调用preg_replace时,它将尝试通过使用替换作为
$11
来查找反向引用#11,显然它不存在。

现在如果你将其更改为:

$replacement = '$1' . ' ';

它将具有价值

$1
,并且您的替代品将正确地正确地
'April '

关于大括号的使用: 大括号用于显式指定变量名称的结尾,因此效果很好:

$replacement = '${1}' . '1';

并将字符串替换为

'April1

© www.soinside.com 2019 - 2024. All rights reserved.