我的网址可能看起来像/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
3a6p412
/posts/3a6p412
3a6p412
不匹配的路径
/posts/-3a6p412
答案 0 :(得分:1)
试试这个:
\/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
答案 1 :(得分:1)
我无法得到你想要的东西,但这很接近:
router.get('/posts/:slug([a-z][a-z\-]{0,}-|):id([a-zA-Z0-9]+)', function (req, res) {
如果slug
存在,-
将包含尾随[a-z][a-z\-]{0,}
,如果没有slug,它将是一个空字符串。第a-z
部分确保子弹必须以a-z
范围内的字符开头,然后可以包含来自-
或{0,}
的任意数量的字符。如果您的slu can可以包含其他角色,您只需要相应地调整该部分。请注意,我使用*
而不是*
,因为Express路由如何解释foo.localhost
。
Express路由转换为正则表达式的方式有点难以理解,Express 4和5之间存在重大变化,这使得使用复杂表达式成为未来兼容性的不安全选择。如果你想做一些比文档中给出的例子更复杂的事情,我建议只使用一个实际的RegExp来切断不可靠的中间人。或者,您可以跳过尝试完全解析/验证路径路径中的URL,而不是在处理函数内部执行此操作。