PHP preg_match匹配错误的字符串

时间:2014-03-01 01:32:24

标签: php regex preg-match

我有一个正则表达式:

/\/(register)(?:\/activate\/(.{16}))?(?:\/(student|teacher|org))?\/?$/

正确匹配字符串:

/register
/register/student
/register/activate/1234567890123456/

不匹配问题:

/register/register/register/register/student/

在PHP中使用preg_match时,上面仍然匹配。任何替代方案?

我也尝试将'register'限制为1:

\/((?:register){1})(?:\/activate\/(.{16}))?(?:\/(student|teacher|org))?\/?$

没有运气。

使用Debuggex不匹配,但使用http://www.phpliveregex.com/

进行匹配

Debuggex Demo

2 个答案:

答案 0 :(得分:0)

在字符串的开头使用^来锚定它。

/^\/(register)(?:\/activate\/(.{16}))?(?:\/(student|teacher|org))?\/?$/
 * here

在开始时不使用锚点,它实际上匹配如下:

/register/register/register/register/student/
                           ^----------------^

答案 1 :(得分:0)

问题是您只是尝试使用$来匹配字符串的结尾。这意味着正则表达式将匹配您的表达式,无论其前面是什么。

表达式/bob$/将匹配以bob结尾的所有内容,例如: big bob。这正是这里发生的事情。

您需要强制preg_match匹配整个字符串(即开头和结尾),前缀为^

/^\/(register)(?:\/activate\/(.{16}))?(?:\/(student|teacher|org))?\/?$/