在快速路由器中使分隔符可选
Make separator optional in express router
我的网址可能看起来像 /posts/sluggish-slug-postId123
或 /posts/postId123
。
我的路由器当前包含:
router.get('/posts/:slug?-:id([a-zA-Z0-9]+)', function () {...}
但使用此正则表达式 slug
和 id
之间的 -
是强制性的,这意味着我无法验证仅包含 id
的网址(例如 /posts/postId123
)。如何使 -
分隔符可选并保持 slug
可选?
应该匹配的路径
/posts/going-long-for-the-ball-3a6p412
- 鼻涕虫:
going-long-for-the-ball
- id:
3a6p412
/posts/3a6p412
- slug: 未设置
- id:
3a6p412
应该不匹配的路径
/posts/-3a6p412
试试这个:
\/posts\/(?<slug>.+\-)?(?<id>\w+)$
结果:
/posts/going-long-for-the-ball-3a6p412 (match)
/posts/3a6p412 (match)
/posts/-3a6p412 (no match)
你可以在这里测试:https://regex101.com/r/jLMzjM/2
我不太明白你想要什么,但这很接近:
router.get('/posts/:slug([a-z][a-z\-]{0,}-|):id([a-zA-Z0-9]+)', function (req, res) {
slug
将包括结尾的 -
(如果存在),如果没有 slug 则它将是一个空字符串。 [a-z][a-z\-]{0,}
部分确保 slug 必须以 a-z
范围内的字符开头,然后可以包含 a-z
或 -
中的任意数量的字符。如果您的 slug 可以包含其他字符,您只需要相应地调整该部分。请注意,我使用的是 {0,}
而不是 *
,因为 Express 路由解释 *
.
的方式有一个怪癖
Express 路由转换为正则表达式的方式有些难以遵循,并且 Express 4 和 5 之间存在重大变化,这使得使用复杂表达式成为未来兼容性的不安全赌注。如果您想做一些比文档中给出的示例更复杂的事情,我建议您只使用实际的 RegExp 来代替不可靠的中间人。或者,您可以完全跳过尝试 parse/validate 路由路径中的 URL,而是在您的处理程序函数中执行此操作。
我的网址可能看起来像 /posts/sluggish-slug-postId123
或 /posts/postId123
。
我的路由器当前包含:
router.get('/posts/:slug?-:id([a-zA-Z0-9]+)', function () {...}
但使用此正则表达式 slug
和 id
之间的 -
是强制性的,这意味着我无法验证仅包含 id
的网址(例如 /posts/postId123
)。如何使 -
分隔符可选并保持 slug
可选?
应该匹配的路径
/posts/going-long-for-the-ball-3a6p412
- 鼻涕虫:
going-long-for-the-ball
- id:
3a6p412
- 鼻涕虫:
/posts/3a6p412
- slug: 未设置
- id:
3a6p412
应该不匹配的路径
/posts/-3a6p412
试试这个:
\/posts\/(?<slug>.+\-)?(?<id>\w+)$
结果:
/posts/going-long-for-the-ball-3a6p412 (match)
/posts/3a6p412 (match)
/posts/-3a6p412 (no match)
你可以在这里测试:https://regex101.com/r/jLMzjM/2
我不太明白你想要什么,但这很接近:
router.get('/posts/:slug([a-z][a-z\-]{0,}-|):id([a-zA-Z0-9]+)', function (req, res) {
slug
将包括结尾的 -
(如果存在),如果没有 slug 则它将是一个空字符串。 [a-z][a-z\-]{0,}
部分确保 slug 必须以 a-z
范围内的字符开头,然后可以包含 a-z
或 -
中的任意数量的字符。如果您的 slug 可以包含其他字符,您只需要相应地调整该部分。请注意,我使用的是 {0,}
而不是 *
,因为 Express 路由解释 *
.
Express 路由转换为正则表达式的方式有些难以遵循,并且 Express 4 和 5 之间存在重大变化,这使得使用复杂表达式成为未来兼容性的不安全赌注。如果您想做一些比文档中给出的示例更复杂的事情,我建议您只使用实际的 RegExp 来代替不可靠的中间人。或者,您可以完全跳过尝试 parse/validate 路由路径中的 URL,而是在您的处理程序函数中执行此操作。