我正在匹配 url,所以我可以将请求连接到控制器/视图,并且有几个 url 有多个选项,其中只有一个可以在 url 后面有任何内容,但我还需要后面的内容可作为命名组使用。
例子:
- /admin/某事#match
- /admin/something/new #match
- /admin/something/new/id #失败
- /admin/something/edit #失败
- /admin/something/edit/id #match
还有很多其他的可能性,但这足以作为一个例子。基本上,如果 url 以 'new' 结尾,什么都不能跟随,而如果它以 'edit' 结尾,它也必须有一个 id 才能编辑。
到目前为止我一直在使用的正则表达式:
^/admin/something(?:/(?P<action>new|edit(?:/(?P<id>\d{1,5}))))?$
空格爆炸版本:
^/admin/something(?:/
(?P<action>
new| # create a new something
edit(?:/ # edit an old something
(?P<id>\d{1,5}) # id to edit
)
)
)? # actions on something are optional
$
但是如果 url 是“/admin/something/edit/id”,那么“action”组就是“edit/id”。我一直在控制器中使用一些字符串操作来将动作缩减为......动作,但我觉得积极的前瞻会更清晰。我只是无法让它发挥作用。
我一直在使用的前瞻正则表达式:(将匹配“新”,但不匹配“编辑”[带或不带 id])
^/admin/something(?:/(?P<action>new|edit(?=(?:/(?P<id>\d{1,5})))))?$
任何提示/建议将不胜感激。