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/行末文字を追加したのと等しい場合にのみ一致するべきではありません$か?

4

3 に答える 3

5

交代を括弧で囲む必要があります。

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

括弧なしは、意図したものではないことを^a|b|c$意味します。(^a)|b|(c$)

于 2012-12-18T09:40:54.530 に答える
3

問題は、/$が最後のオプションとグループ化されていることです。現時点では、次の正規表現のいずれかに一致する文字列が見つかった場合、2 番目の条件は true になります。

  1. ^/(ACT)
  2. NSW
  3. NT
  4. QLD
  5. SA
  6. TAS
  7. VIC(これは合ってる)
  8. (WA)/$

あなたが提供したサンプル文字列には、実際には #6 - への一致が含まれているVICため、条件全体が true と評価されます。マークが指摘したように、括弧を使用して中心値をグループ化する必要があります。

于 2012-12-18T09:44:14.043 に答える
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 で終わります。

于 2012-12-18T10:04:35.377 に答える