2014-03-01 23 views
0

我有一個正則表達式:PHP的preg_match匹配錯誤的字符串

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

正確匹配,字符串:

/register 
/register/student 
/register/activate/123456789/ 

不匹配問題:

/register/register/register/register/student/ 

上面,而在使用的preg_match仍然匹配PHP。任何替代品?

我也試圖限制 '註冊',以1:

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

沒有運氣。

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

Debuggex Demo

回答

0

使用^在你的字符串的開頭來錨定它。

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

沒有在開始的時候使用錨實際上是匹配象下面這樣:

/register/register/register/register/student/ 
          ^----------------^ 
+0

哦,是的,謝謝!我對所有其他表情都有這種看法,我想在經過多次編輯後,它會以某種方式被刪除。 –

+1

另外,使用另一個字符(例如〜或#)來分隔您的模式。這樣你就不必逃避你模式中的所有/:'〜/(註冊)(?:/ activate /(。{16}))?(?:/(student | teacher | org) )?/?$〜「' –

0

問題是,你只嘗試使用$到字符串的結尾相匹配。這意味着正則表達式將匹配您的表達式,而不管之前發生了什麼。

擁有一個表達式/bob$/將匹配以bob結尾的所有內容,例如, big bob。這正是這裏發生的。

您需要強制preg_match通過以^爲前綴來匹配整個字符串(即開頭和結尾)。

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