你的浏览器不支持canvas

Enjoy life!

javascript - 处理带有参数的URL

Date: Author: JM

本文章采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可。

一、 处理带有参数的URL

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>处理有参数的URL</title>
</head>
<body>
<h2>带有参数的url</h2>
<p>/v1/api/:id/books?username=:name&password=:pwd</p>

<h2>真实的url</h2>
<p>/v1/api/123/books?username=garven&password=9898p</p>

<script>
    let realUrl = '/v1/api/123/books?username=garven&password='
    let apiUrl = '/v1/api/:id/books?username=:name&password=:pwd'
    dealWithUrlWithParams(realUrl, apiUrl)


    /**
     * 处理带有参数的url
     * @param {String} realUrl 真实路由
     * @param {String} apiUrl 匹配路由
     * @return {Object}
     * @example {
     *      id: "123",
     *      name: "garven"
     * }
     */

    function dealWithUrlWithParams (realUrl,apiUrl) {
      let apiReg = apiUrl
      let result = []
      let params = {}


      /*
        第一:路径中的“/”需要转义
        第二:路径中的 “?”需要转义
        第三:将参数转换成 [\w\u4e00-\u9fa5] (\u4e00-\u9fa5代表任意汉字)
            参数的表示状态有三种:
                第一种::id/
                第二种::id?
                第三种::id&
            $1:指示的是 \/ 或者 \? 或者 & 或者 $ ($1表示第一个捕获组的字符串)
       */
      
      apiReg = apiUrl.replace(/\//g, '\\\/')
        .replace(/\?/g, '\\\?')

      // 获取参数名,存储在数组里
      let paramsResult = apiReg.match(/:\w+(?=\\\/|\\\?|&|$)/g)

      // 将参数转换成 [\w\u4e00-\u9fa5]
      apiReg = apiReg.replace(/:\w+(\\\/|\\\?|&|$)/g, '([\\w\u4e00-\u9fa5]*?)$1')

      // 将字符串转化成正则表达式
      apiReg = new RegExp(`^${apiReg}$`)

      // 获取参数值
      let apiRegResult = realUrl.match(apiReg)
      if (apiRegResult && apiRegResult.length) {
        result = apiRegResult.splice(1)
      }

      // 将参数名和参数值一一对应
      for (let i = 0, len = paramsResult.length; i < len; i++) {
        const name = paramsResult[i].slice(1)
        const value = result[i]
        params[name] = value
      }

      return params
    }
</script>
</body>
</html>

对于本文内容有问题或建议的小伙伴,欢迎在文章底部留言交流讨论。