文章封面

js 解析 url search params 特殊字符问题

发布于 2020-07-04 20:46:09阅读量 114

最近开发时遇到了URL中的 query 参数解析异常问题。表现为:

假设 URL 中 seacr 部分为:?name=dd+ =iuio,常用的 qs 库解析 query 参数为:

{ name: 'dd  =iuio' }

更换使用 node url 模块解析也是如此。思来想去,最终还是决定手写解析方法:

const assert = require('assert');

function parseQuery(str) {
  str = str.trim().replace(/^(\?|#|&)/, '');

  if (!str) {
    return {};
  }

  const res = {};

  str.split('').forEach((params) => {
    const parts = params.split('=');
    const key = parts.shift();
    const val = parts.length > 0 ? decodeURIComponent(parts.join('=')) : null;

    if (res[key] === undefined) {
      res[key] = val;
    } else if (Array.isArray(res[key])) {
      res[key].push(val);
    } else {
      res[key] = [res[key], val];
    }
  });

  return res;
}

assert.deepEqual(parseQuery(`?name=dd+ =iuio`), { name: 'dd+ =iuio' });
assert.deepEqual(parseQuery(`?name=dd+ =iuio=ui`), { name: 'dd+ =iuio=ui' });
assert.deepEqual(parseQuery(`?name=dd+ =iuio=ui&name=ui#`), {
  name: ['dd+ =iuio=ui', 'ui#'],
});
assert.deepEqual(parseQuery(`?name=; , / ? : @ = + $ - _ . ! ~ * ' " ( )`), {
  name: `; , / ? : @ = + $ - _ . ! ~ * ' " ( )`,
});

发布时间:2020-07-04 20:46:09

版权信息:非商用-署名-自由转载

推荐阅读

暂无推荐

    评论

    编辑器努力加载中...