这个preg_replace中$ 1 $ 2 $ 4的含义是什么?

Tay*_*lor 15 php regex

有这个功能来修改查询字符串,并想知道pre_replace的替换部分意味着什么(ie- $ 1 $ 2 $ 4).

function add_querystring_var($url, $key, $value) { 
$url = preg_replace('/(.*)(\?|&)' . $key . '=[^&]+?(&)(.*)/i', '$1$2$4', $url . '&'); 
$url = substr($url, 0, -1); 
if (strpos($url, '?') === false) { 
  return ($url . '?' . $key . '=' . $value); 
} else { 
  return ($url . '&' . $key . '=' . $value); 
} 
}
Run Code Online (Sandbox Code Playgroud)

不太熟悉正则表达式的东西.我得到了各种部件preg_replace但不是100%关于在替换部件中使用'$ 1 $ 2 $ 4'.

And*_*y E 22

$1, $2... $n在正则表达式中,替换是对括在括号中的匹配的引用. $0将是整个比赛,$1将是第一个括号捕获,$2将是第二个,等等.

  • $1 是对第一个匹配的参考 (.*)
  • $2 是一个参考 (\?|&)
  • $4 是对第二个的引用 (.*)

查看文档,特别是函数的替换参数:

替换可能包含形式的引用\n或(自PHP 4.0.4起)$ n,后一种形式是首选形式.每个这样的引用将被第n个带括号的模式捕获的文本替换.n可以是0到99,\ 0或$ 0是指整个模式匹配的文本.打开括号从左到右计数(从1开始)以获得捕获子模式的编号.要替换使用反斜杠,必须加倍("\\"PHP字符串).


amp*_*ine 6

Perl正则表达式替换使用匹配变量,它们是正则表达式中括号内的部分:

   $1   $2                      $3 $4
'/(.*)(\?|&)' . $key . '=[^&]+?(&)(.*)/i'
Run Code Online (Sandbox Code Playgroud)

因此,$1在替换字符串中引用将替换第一个括号中匹配的内容.$0但是会引用整个匹配的字符串.

您甚至可以使用反斜杠而不是美元符号来匹配正则表达式内部的括号子集.例如,如果您想要替换双字"the"或"and":

preg_replace('/\b(the|and)\b\s*\1/', '$1', $sentence);
Run Code Online (Sandbox Code Playgroud)