在快速路由器中使分隔符可选

时间:2017-10-30 17:00:48

标签: regex express url-routing

我的网址可能看起来像/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
    • slug:going-long-for-the-ball
    • id:3a6p412
  • /posts/3a6p412
    • slug:未设置
    • id:3a6p412

匹配的路径

  • /posts/-3a6p412

2 个答案:

答案 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,而不是在处理函数内部执行此操作。