这是什么`#((?< = \?)|&)openid \。[^&] +#`regexp是什么意思?

时间:2011-07-17 10:46:28

标签: php regex

所以我试着读一些PHP代码......我找到了这样的行

$uri = rtrim(preg_replace('#((?<=\?)|&)openid\.[^&]+#', '', $_SERVER['REQUEST_URI']), '?');
这是什么意思?如果它(对我而言)只返回'文件名'为什么它如此复杂?

1 个答案:

答案 0 :(得分:10)

该行的目的是从请求URI中删除openid.something=value之类的值。

有一些工具可以将正则表达式翻译成散文,目的是帮助您了解正则表达式试图匹配的内容。例如,当您的传递到such a tool时,描述将返回:

NODE                     EXPLANATION
--------------------------------------------------------------------------------
  (                        group and capture to \1:
--------------------------------------------------------------------------------
    (?<=                     look behind to see if there is:
--------------------------------------------------------------------------------
      \?                       '?'
--------------------------------------------------------------------------------
    )                        end of look-behind
--------------------------------------------------------------------------------
   |                        OR
--------------------------------------------------------------------------------
    &                        '&'
--------------------------------------------------------------------------------
  )                        end of \1
--------------------------------------------------------------------------------
  openid                   'openid'
--------------------------------------------------------------------------------
  \.                       '.'
--------------------------------------------------------------------------------
  [^&]+                    any character except: '&' (1 or more times
                           (matching the most amount possible))

如上所述,正则表达式会查找?&后跟openid.,后跟任何不是&的内容。得到的匹配将包括前一个&(如果有),但不包括?,因为look behind用于后者。