2012-12-18 60 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結束。

相關問題