正则表达式示例

时间:2012-01-27 05:53:41

标签: php regex

我对这个问题有所了解:

<?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'; 如果有人为我澄清,我将不胜感激。

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