2012-12-18 172 views
2

我有一大堆的内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/,因为我添加了行尾字符$

+2

我也不会想到的“/ VIC /事件”是由这两种模式 – Dale

+1

@Dale的匹配:乍一看它看起来并不像它应该匹配,但再仔细一看(或尝试一下)和你会发现它确实匹配。 –

+0

@MarkByers但'$'不会匹配'/ VIC/events' – Dale

回答

5

您需要括号围绕你的交替:

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

如果没有括号^a|b|c$意味着(^a)|b|(c$)这是不是你预期什么。

3

问题是/$正在与最后一个选项分组。

  1. ^/(ACT)
  2. NSW
  3. NT
  4. QLD
  5. SA
  6. :目前,如果匹配到以下任何使用regexen的字符串中找到你的第二个条件将truthy
  7. TAS
  8. VIC(这个匹配)
  9. (WA)/$

您提供确实实际上包含匹配#6样品字符串 - VIC,所以整个条件计算为真。正如Mark指出的那样,您需要使用圆括号对中心值进行分组。

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结束。

相关问题