2016-01-24 81 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