Php 为什么这个正则表达式匹配的模式不正确?
我在PHP中有很多正则表达式,第一条是:Php 为什么这个正则表达式匹配的模式不正确?,php,regex,preg-match,Php,Regex,Preg Match,我在PHP中有很多正则表达式,第一条是: if (preg_match('#^/index#i', $_SERVER['REQUEST_URI']) || preg_match('#^/(ACT)|(NSW)|(NT)|(QLD)|(SA)|(TAS)|(VIC)|(WA)/$#i', $_SERVER['REQUEST_URI'])){ 现在,假设$\u服务器['REQUEST\u URI']等于/VIC/events/;出于某种原因,这与第一条相匹配。为什么?当我添加了行尾字符$?时,如果
if (preg_match('#^/index#i', $_SERVER['REQUEST_URI']) || preg_match('#^/(ACT)|(NSW)|(NT)|(QLD)|(SA)|(TAS)|(VIC)|(WA)/$#i', $_SERVER['REQUEST_URI'])){
现在,假设
$\u服务器['REQUEST\u URI']
等于/VIC/events/
;出于某种原因,这与第一条相匹配。为什么?当我添加了行尾字符$
?时,如果它等于/VIC/
,那么它不应该只匹配它吗
'#^/(ACT|NSW|NT|QLD|SA|TAS|VIC|WA)/$#i'
没有括号,
^a | b | c$
表示(^a)| b |(c$)
,这不是您想要的。问题是/$
与最后一个选项分组。目前,如果在字符串中找到与以下任何正则表达式匹配的项,则您的第二个条件将是真实的:
^/(ACT)
NSW
NT
QLD
SA
TAS
VIC
(此项匹配)(WA)/$
您提供的示例字符串实际上包含与#6-
VIC
的匹配项,因此整个条件的计算结果为true。正如Mark所指出的,您需要使用括号对中心值进行分组。您应该使用括号来标记分组,如下所示:
'#^/((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结尾。我想不到“/VIC/events”与这两个词匹配patterns@Dale:乍一看,它似乎不应该匹配,但请仔细查看(或试用)您将看到它实际上是匹配的。@MarkByers但是
$
不匹配/VIC/events
@Dale:试试看:。请阅读下面我的答案以获得解释。@MarkByers如果我完全不理解这里的内容,请原谅我,但它仍然与/VIC/events