1

私はクライアント側の MVC アプリ用の JavaScript ルーター エンジンに取り組んでいます... Backbone や Spine のようなものが関係しています。

ルーターは、オプションでリソース タイトルを含み、オプションで要求形式を含む URI セグメントと一致する必要があります。

:id次のように、 resource 、オプションの: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 に答える