我在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/
时,如果它等于$
,那么它是否只匹配它?
答案 0 :(得分:5)
您需要围绕轮换进行括号:
'#^/(ACT|NSW|NT|QLD|SA|TAS|VIC|WA)/$#i'
没有括号^a|b|c$
表示(^a)|b|(c$)
,这不是您的意图。
答案 1 :(得分:3)
问题是/$
正在与最后一个选项分组。目前,如果在字符串中找到与以下任何regexen的匹配,则您的第二个条件将是真实的:
^/(ACT)
NSW
NT
QLD
SA
TAS
VIC
(这个匹配)(WA)/$
您提供的示例字符串 实际上包含与#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结束。