$1$2$4 在这个preg_replace是什么意思?

2022-08-30 19:50:06

获得此函数以修改查询字符串,并且想知道pre_replace的替换部分是什么意思(即 $ 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); 
} 
}

不太熟悉正则表达式的东西。我让各个部分preg_replace但不是100%关于在更换部件中使用“$ 1 $ 2 $ 4”。


答案 1

$1, $2... $n在正则表达式中,替换是对括在括号中的匹配项的引用。 将是整个匹配项,将是第一个括号内的捕获,将是第二个,依此类推。$0$1$2

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

请参阅文档,特别是函数的替换参数:

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


答案 2

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

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

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

您甚至可以使用反斜杠而不是美元符号来匹配正则表达式本身内的括号子集。例如,如果要替换双引号“the”或“and”:

preg_replace('/\b(the|and)\b\s*\1/', '$1', $sentence);

推荐