我正在开发一个用于客户端MVC应用程序的JavaScript路由器引擎......涉及Backbone或Spine等。
我的路由器需要匹配可选择包含资源标题的URI段,并可选择包含请求格式。
我希望捕获资源:id
,可选的:name
段和可选的:format
段,以便:
/123 => id:'123', name: undefined, format: undefined
/123-my-name => id:'123', name:'my-name', format: undefined
/123.html => id:'123', name: undefined, format:'html'
/123-my-name.html => id:'123', name:'my-name', format:'html'
编辑:还有其他路线会与嵌套路径匹配,因此此表达式不应与/123-my-name/edit
或/123-my-name/edit.html
匹配
我可以轻松匹配可选的:name
或:format
细分,但两者都不存在,但我无法区分:name
和:format
在场。
有什么建议吗?
答案 0 :(得分:3)
> re = /\/(\w+)(?:-(\w[-\w]+))?(?:\.(html))?/
/\/(\w+)(?:-(\w[-\w]+))?(?:\.(html))?/
> "/123".match(re)
["/123", "123", undefined, undefined]
> "/123-my-name".match(re)
["/123-my-name", "123", "my-name", undefined]
> "/123.html".match(re)
["/123.html", "123", undefined, "html"]
> "/123-my-name.html".match(re)
["/123-my-name.html", "123", "my-name", "html"]
然后,
m = url.match(re)
id = m[1]
name = m[2] || default
format = m[3] || default
更具体的选项(id =仅数字,已锚定):
> re = /^\/(\d+)(?:-(\w[-\w]+))?(?:\.(html))?$/
/^\/(\d+)(?:-(\w[-\w]+))?(?:\.(html))?$/
> "/123-my-route/edit.html".match(re)
null