我无法理解这一点:
$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';
如果有人为我澄清,我将不胜感激。
程序员必须使用这个,因为
$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
。
这是 php 在正则表达式上下文中处理反向引用的结果。
${1}
是将反向引用与文字 1
分开所必需的。如果模式是 $11
,php 会认为 $11
是对第十一个捕获组的引用。
这里的问题是您事先构造了
$replacement
变量,并且所有字符串连接都发生在调用 preg_replace 之前。举个例子:
假设您有:
$replacement = '$1' . '1';
这将做的是将值
$11
放入变量$replacement中,当调用preg_replace时,它将尝试通过使用替换作为$11
来查找反向引用#11,显然它不存在。
现在如果你将其更改为:
$replacement = '$1' . ' ';
它将具有价值
$1
,并且您的替代品将正确地正确地到'April '
。
关于大括号的使用: 大括号用于显式指定变量名称的结尾,因此效果很好:
$replacement = '${1}' . '1';
并将字符串替换为
'April1