我有一个正则表达式:
/\/(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/
进行匹配答案 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))?\/?$/