我对这个问题有所了解:
<?php
$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';
如果有人为我澄清,我将不胜感激。
答案 0 :(得分:2)
程序员必须使用它,因为
$replacement = '$11,$3';
会表现出奇怪和错误。此外,他们无法使用
$replacement = '$1'.'1,$3';
也是因为它会导致它被解析为第一个例子。
这就是为什么有这些括号,它们作为变量和数字1
之间的分隔符。
与
相同$username = "Martin"
$text = "Hello ${username}and welcome";
以上示例将输出“Hello Martinand welcome”
但是这个
$username = "Martin";
$text = "Hello $usernameand welcome";
将变量名称与纯文本混在一起,这是您的替代号码1
答案 1 :(得分:1)
${1}
语法引用模式匹配中的第一个捕获组。在这种特殊情况下,这是必要的,因为替换的所需输出是第一个捕获组,后跟文字1
。
这是由php如何在regex上下文中处理反向引用的结果。 ${1}
是将反向引用与文字1
分开所必需的。如果模式为$11
,那么php会认为$11
是对第11个捕获组的引用。
答案 2 :(得分:1)
这里的问题是你预先构造$replacement
变量,并且在调用preg_replace之前发生所有字符串连接。举个例子:
假设你有:
$replacement = '$1' . '1';
这样做的目的是将值$11
放入变量$ replacement中,当调用preg_replace时,它将尝试使用替换为$11
来查找后引用#11,显然它不会不存在。
现在,如果您将其更改为:
$replacement = '$1' . ' ';
它的值为$1
,您的替代品将正确正确到'April '
。
关于大括号的使用:大括号用于显式指定变量名的结尾,因此这样可以正常工作:
$replacement = '${1}' . '1';
并将字符串替换为'April1