javascript - 通过正则表达式进行 JSON 路由匹配

标签 javascript json node.js

考虑我有以下 JSON 对象

var urls = {
  "GET/users/:id":1,
  "POST/users":0
}

如果我有字符串“GET/users/10”。如何使用它作为键从 urls JSON 获取值,即 "GET/users/10" 应匹配 "GET/users/:id"

我不想迭代 url JSON 并为每个键使用正则表达式。

有没有办法使用正则表达式访问 JSON 对象?

提前致谢。

最佳答案

这里有一些应该适合你的东西。我从 Durandal router's RegEx matching logic 中获取了一些片段。它基本上动态创建一个 regular expression object基于定义的路由字符串,然后针对传递的字符串进行测试

这是工作示例:

var urls = {
  "GET/users/:id": 1,
  "POST/users": 0
}

const getRouteRegExp = (
  routeString,
  routesAreCaseSensitive = false,
  optionalParam = /\((.*?)\)/g,
  namedParam = /(\(\?)?:\w+/g,
  splatParam = /\*\w+/g,
  escapeRegExp = /[\-{}\[\]+?.,\\\^$|#\s]/g
) => {
  routeString = routeString.replace(escapeRegExp, '\\$&')
    .replace(optionalParam, '(?:$1)?')
    .replace(namedParam, function(match, optional) {
      return optional ? match : '([^\/]+)';
    })
    .replace(splatParam, '(.*?)');

  return new RegExp('^' + routeString + '$', routesAreCaseSensitive ? undefined : 'i');
}

const getRouteByString = (string) => {
  var resultArr = Object.entries(urls).find(([k, v]) => {
    var regEx = getRouteRegExp(k)
    return regEx.test(string)
  }) || []
  return resultArr[0]
}

console.log(getRouteByString('GET/users/10'))
console.log(getRouteByString('POST/users'))
console.log(getRouteByString('POST/users2'))

所以你所拥有的是getRouteRegExp函数,它是这里的主要功能,它将根据传递的route组成一个正则表达式对象。

之后,我们为 urls 中定义的每个现有路由创建一个正则表达式,并尝试将其与提供的字符串路由进行匹配。这就是find 的作用。如果找到,我们会将其退回。

既然我们正在做Object.entries我们返回包含结果的 0 索引。

由于这直接来自 Durandal 位,因此它支持 Durandal 中内置的所有路由表达式...例如:

  • 静态路线:门票
  • 参数化:tickets/:id
  • 可选参数:users(/:id)
  • Splat 路线:设置*详细信息

您可以阅读有关 Durandal Router here 的更多信息

关于javascript - 通过正则表达式进行 JSON 路由匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52530593/

相关文章:

javascript - 正确部署 Google Rich Card 的结构化数据

javascript - 如何使用 jQuery 在页面加载时关注表单输入文本字段?

php - 如何解码来自 facebook 的 Json 响应

objective-c - AFNetworking POST 请求中的 JSON 数据困惑

javascript - 在生产中调用销毁时,不会从 Mongo 存储中删除 Express session 数据

javascript - HTML - 无法让标题在滚动中保持固定

javascript - 如何访问容器搜索 Firefox 附加组件

Java Json pretty-print javax.json

javascript - 自定义谷歌自定义搜索引擎。特别是更改标题字体

javascript - React + D3 强制布局 : new Links have undefined positions