这个函数用于修改查询字符串,并想知道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);
}
}
不熟悉正则表达式的东西。我得到了preg_replace的各个部分,但没有100%关于在替换部分中使用'$ 1 $ 2 $ 4'。
答案 0 :(得分:22)
$1, $2... $n
是对括在括号中的匹配的引用。 $0
将是整个匹配,$1
将是第一个带括号的捕获,$2
将是第二个,等等。
$1
是对第一个(.*)
$2
是对(\?|&)
$4
是对第二个(.*)
请参阅the docs,特别是函数的替换参数:
replacement 可能包含形式为\ n或(自PHP 4.0.4起)$ n的引用,后一种形式是首选形式。每个这样的引用将被第n个带括号的模式捕获的文本替换。 n可以是0到99,\ 0或$ 0是指整个模式匹配的文本。打开括号从左到右计数(从1开始)以获得捕获子模式的编号。要替换使用反斜杠,必须加倍(“\\”PHP字符串)。
答案 1 :(得分:6)
Perl正则表达式替换使用匹配变量,它们是正则表达式中括号内的部分:
$1 $2 $3 $4
'/(.*)(\?|&)' . $key . '=[^&]+?(&)(.*)/i'
因此,在替换字符串中引用$1
将替换第一个括号中匹配的内容。 $0
但是会引用整个匹配字符串。
您甚至可以使用反斜杠而不是美元符号来匹配正则表达式内部的括号子集。例如,如果您想要替换双字“the”或“and”:
preg_replace('/\b(the|and)\b\s*\1/', '$1', $sentence);
答案 2 :(得分:2)
括号内的正则表达式的每个部分都是占位符,它们会替换正则表达式中指定的部分。