【问题标题】:What does the $1$2$4 mean in this preg_replace?这个 preg_replace 中的 $1$2$4 是什么意思?
【发布时间】:2010-05-22 14:21:54
【问题描述】:

获得了用于修改查询字符串的函数,并且想知道 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”。

【问题讨论】:

    标签: php regex


    【解决方案1】:

    $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 字符串)。

    【讨论】:

    • 现在更有意义了。这样 preg_replace 基本上会从 $url 中删除 $key 匹配项。
    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 谢谢,这也很有帮助。希望我能选择两个答案!
    【解决方案3】:

    括号中的正则表达式的每个部分都是占位符,它们替换正则表达式中指定的部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-26
      • 2019-04-24
      • 1970-01-01
      • 1970-01-01
      • 2020-07-05
      • 1970-01-01
      • 2020-02-15
      • 2010-10-23
      相关资源
      最近更新 更多