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

Rel*_*lla 2 php regex

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

$uri = rtrim(preg_replace('#((?<=\?)|&)openid\.[^&]+#', '', $_SERVER['REQUEST_URI']), '?');
Run Code Online (Sandbox Code Playgroud)

这是什么意思?如果它(对我而言)只返回'文件名'为什么它如此复杂?

sal*_*the 10

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

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

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))
Run Code Online (Sandbox Code Playgroud)

如上所述,正则表达式寻找a ?或者&后跟openid.,然后是任何东西&.得到的匹配将包括前面的,&如果有一个,但不包括,?因为后面的后面用于后者.