【问题标题】:Express Javascript Regex to only allow strings without periodsExpress Javascript Regex 仅允许不带句点的字符串
【发布时间】:2015-08-24 22:31:18
【问题描述】:

我有一个处理 localhost:3000/test 的快速路由。我希望在此之后没有时间段的所有内容都可以使用相同的 router.get 命令进行渲染。我正在努力找出正确的 Javascript 正则表达式字符串。

router.get('/test/:path[\s^.]*$', function () {
    //res.render etc
}

所以,当我访问 localhost:3000/test/math 或 localhost:3000/test/math/geometry 时,我希望它使用相同的路线。但是当我导航到 localhost:3000/test/math/geometry.test 我希望它使用不同的路线。我之前使用过正则表达式,只是不确定如何将它与 express params 功能结合起来。

编辑:adeno 的想法不起作用,因为我无法使用一段时间的检查正确链接我的函数。这是正则表达式的重点,所以我在执行页面逻辑之前检查了 url。

Raul 恐怕你误解了这个问题。让我试着更清楚地说明它。

我有一个这样的文件夹列表:

test
--folder1
----test1.js
----test2.js
----test3.js
--folder2
----folder2-1
----folder2-3
------test4.js
------test5.js
----test6.js
--folder3

以下网址应该有一个正则表达式来捕获它们:

test/folder1
test/folder2
test/folder2/folder2-3

另一个只捕获以下内容:

test/folder1/test1.js
test/folder2/folder2-3/test4.js
test/folder2/test6.js

就像我说的,我已经完成了正则表达式,我只是不知道如何使用 Express 的 :paramName 功能。

【问题讨论】:

  • 不需要在正则表达式中转义句点吗?克拉可能需要在字符类中,但不确定;这是一个特殊字符,意思是行首。
  • 你不能真正在字符串中添加正则表达式,要么使用正则表达式作为路由,要么使用字符串
  • 最简单的方法可能是检查路由内一段时间的 url,然后调用 next()
  • adeneo 这是一个很好的观点。我会试试的。

标签: javascript regex node.js express routes


【解决方案1】:

在这种情况下,顺序确实很重要。 如果你把异常放在首位,你将处理路径。

app.get('/test/math/geometry.test', function (req, res) {
  res.send('catch it');
});

app.get('/test/:path*', function (req, res) {
  res.send('the params are    ' +  JSON.stringify(req.params));
});

如果您尝试使用例如“/test/maths/dificults”这条路线,您最终会看到 req.params 具有以下内容:

 {"0":"/maths/dificults","path":"maths"}

您可以按位置访问原始参数,在本例中为“0”,因为按名称,您在第一个“/”中剪切了参数

编辑

您可以应用相同的概念并在里面使用真正的正则表达式:

app.get(/\/test\/[^\.]*$/, function (req, res) {
  res.send('catch it without dot');
});

app.get('/test/*', function (req, res) {
  res.send('catch it with dot');
});

您可以使用 parentesis () 来捕获参数 req.params like //test/([^.]*)$/

【讨论】:

  • 你有一个更新。我希望我能理解你的问题,基本上你可以使用一个完整的正则表达式,如果你使用正常的语法,你可以使用非常小的选项。例如,无法访问 ^
  • 解析后的url在req.originalUrl中
  • 是的,我做到了。 stackoverflow.com/questions/30764509/…
  • 在这种情况下,您可以将答案标记为正确,写下您的答案并将其标记为正确,或者关闭问题或标记为重复。
  • 这里的主要问题是我试图在字符串中使用正则表达式语法,而不是使用普通的正则表达式。除此之外,问题是关于使用带有快速路由的参数名称,这个答案虽然没有解决我的问题,但足以回答这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多