[英]PHP preg_match Matching Wrong String
我有一個正則表達式:
/\/(register)(?:\/activate\/(.{16}))?(?:\/(student|teacher|org))?\/?$/
正確的匹配字符串:
/register
/register/student
/register/activate/1234567890123456/
不匹配問題:
/register/register/register/register/student/
當在PHP中使用preg_match時,以上內容仍然匹配。 有其他選擇嗎?
我也嘗試將“寄存器”限制為1:
\/((?:register){1})(?:\/activate\/(.{16}))?(?:\/(student|teacher|org))?\/?$
沒運氣。
使用Debuggex不匹配,但是使用http://www.phpliveregex.com/匹配
在字符串的開頭使用^錨定。
/^\/(register)(?:\/activate\/(.{16}))?(?:\/(student|teacher|org))?\/?$/
* here
一開始不使用錨,實際上是如下所示的匹配:
/register/register/register/register/student/
^----------------^
問題是您只想使用$
來匹配字符串的結尾。 這意味着正則表達式將匹配您的表達式,而不管它之前是什么。
具有表達式/bob$/
將匹配以bob結尾的所有內容,例如big bob
。 這就是這里正在發生的事情。
您需要通過為前綴加上^
來強制preg_match
匹配整個字符串(即開頭和結尾)。
/^\/(register)(?:\/activate\/(.{16}))?(?:\/(student|teacher|org))?\/?$/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.