2016-01-24 120 views
1

我有模式:PHP修改的正則表達式

/^(?:{?[a-z0-9\-_]+\??}?\/)+$/ 

現在,這些字符串匹配的模式

user/1/modify/ 
user/{id}/modify/ 
user/{id?}/modify/ 

這是確定的,但現在這種模式匹配

user/{id?/modify/ 

如果左大括號開始它必須以正確結束。我試着用前視,但我不知道這是正確的方式。

回答

2

這應該工作:

^(?:(?:{\w+\??}|\w+)\/)+$ 

https://regex101.com/r/yO3pA5/1

它試圖在集合[A-Za-z0-9_]後跟可選?{}的比賽中任何事情,然後嘗試匹配相同的一組沒有{} S(和可選?,但你可以添加回in),然後是/。這樣它不會允許未封閉的大括號。

+0

最簡單的方法是最好的:) – Mati

1

您可以添加一個正向前查找到第一個條件匹配,以保證右括號有:

^(?:(?:{(?=[\w-]+\??}))?[\w-]+\??}?\/)+$ 

[\w-]相當於[a-z0-9\-_]

See it in action