1

我正在为客户端 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

有什么建议么?

4

1 回答 1

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
于 2013-07-07T21:54:38.073 回答