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

时间:2012-12-18 09:37:57

标签: 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'])){

现在,说$_SERVER['REQUEST_URI']等于/VIC/events/;这是出于某种原因与第一个条款相匹配。为什么?在我添加行尾字符/VIC/时,如果它等于$,那么它是否只匹配它?

3 个答案:

答案 0 :(得分:5)

您需要围绕轮换进行括号:

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

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

答案 1 :(得分:3)

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

  1. ^/(ACT)
  2. NSW
  3. NT
  4. QLD
  5. SA
  6. TAS
  7. VIC(这个匹配)
  8. (WA)/$
  9. 您提供的示例字符串 实际上包含与#6 - VIC的匹配,因此整个条件的计算结果为true。正如Mark指出的那样,您需要使用括号对中心值进行分组。

答案 2 :(得分:0)

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

'#^/((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结束。