Php 为什么这个正则表达式匹配的模式不正确?

Php 为什么这个正则表达式匹配的模式不正确?,php,regex,preg-match,Php,Regex,Preg Match,我在PHP中有很多正则表达式,第一条是: if (preg_match('#^/index#i', $_SERVER['REQUEST_URI']) || preg_match('#^/(ACT)|(NSW)|(NT)|(QLD)|(SA)|(TAS)|(VIC)|(WA)/$#i', $_SERVER['REQUEST_URI'])){ 现在,假设$\u服务器['REQUEST\u URI']等于/VIC/events/;出于某种原因,这与第一条相匹配。为什么?当我添加了行尾字符$?时,如果

我在PHP中有很多正则表达式,第一条是:

if (preg_match('#^/index#i', $_SERVER['REQUEST_URI']) || preg_match('#^/(ACT)|(NSW)|(NT)|(QLD)|(SA)|(TAS)|(VIC)|(WA)/$#i', $_SERVER['REQUEST_URI'])){

现在,假设
$\u服务器['REQUEST\u URI']
等于
/VIC/events/
;出于某种原因,这与第一条相匹配。为什么?当我添加了行尾字符
$

时,如果它等于
/VIC/
,那么它不应该只匹配它吗

'#^/(ACT|NSW|NT|QLD|SA|TAS|VIC|WA)/$#i'

没有括号,
^a | b | c$
表示
(^a)| b |(c$)
,这不是您想要的。

问题是
/$
与最后一个选项分组。目前,如果在字符串中找到与以下任何正则表达式匹配的项,则您的第二个条件将是真实的:

  • ^/(ACT)
  • NSW
  • NT
  • QLD
  • SA
  • TAS
  • VIC
    (此项匹配)
  • (WA)/$

  • 您提供的示例字符串实际上包含与#6-
    VIC
    的匹配项,因此整个条件的计算结果为true。正如Mark所指出的,您需要使用括号对中心值进行分组。

    您应该使用括号来标记分组,如下所示:

    '#^/((ACT)|(NSW)|(NT)|(QLD)|(SA)|(TAS)|(VIC)|(WA))/$#i',$_SERVER['REQUEST_URI']))
    
    这与以ACT、NSW、NT、QLD、SA、TAS、VIC和WA开头和结尾的任何内容都匹配

    正如您的匹配:

    '#^/(ACT)|(NSW)|(NT)|(QLD)|(SA)|(TAS)|(VIC)|(WA))/$#i',$_SERVER['REQUEST_URI'])
    

    以ACT或NSW、NT、QLD、SA、TAS、VIC开头,或以WA结尾。

    我想不到“/VIC/events”与这两个词匹配patterns@Dale:乍一看,它似乎不应该匹配,但请仔细查看(或试用)您将看到它实际上是匹配的。@MarkByers但是
    $
    不匹配
    /VIC/events
    @Dale:试试看:。请阅读下面我的答案以获得解释。@MarkByers如果我完全不理解这里的内容,请原谅我,但它仍然与
    /VIC/events