2

我在 PHP 中有一堆正则表达式,第一个子句是:

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

现在,say$_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

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

  1. ^/(ACT)
  2. NSW
  3. NT
  4. QLD
  5. SA
  6. TAS
  7. VIC(这个匹配)
  8. (WA)/$

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

于 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 回答