【问题标题】:JavaScript unescape?JavaScript 转义?
【发布时间】:2013-04-19 15:12:33
【问题描述】:

在解析为这样的对象之前,我正在转义 & 和 =:

var obb = parseJSON('{"' + text.replace(/&/g, "\",\"").replace(/=/g,"\":\"") + '"}');

当对象被创建时,我得到:

obb.name
obb.date
obb.text

在 obb.text 里面我想恢复上面完成的转义..

我试过了:

text.replace(/\&/g, "&").replace(/\=/g, "=")

当我在 obb.text 上运行以下内容时

obb.text = decodeURIComponent(escape(obb.text));

我得到解析错误

但似乎不起作用

有什么想法吗?

【问题讨论】:

  • 你想完成什么?你的输入和预期输出是什么?我有一种感觉,你不需要做你正在做的事情。
  • 从开头的文本是这样的 url:name=hello&date=2013&text=hello = bye bye? % lalala "aa"....所以 text.text 可以包含各种字符,这就是我尝试处理它们的原因,所以我不会收到解析错误
  • 为什么不直接URI encode他们?
  • text.text 从服务器发送如下:unescape(encodeURIComponent(body))
  • 为了将它解析成一个对象,我需要 text.replace(/&/g, "\",\"").replace(/=/g,"\":\ "") 在我的客户端上

标签: javascript regex url


【解决方案1】:

与其担心输出数据不包含任何会导致 JSON 解析器出错的内容,不如考虑基于 HTTP RFC 参数解析的这种方法。 RFC RFC (2616) 规定了以下规则:

  • 所有字段都用 & 分隔
  • 所有字段名都在 = 之前,值在 = 之后,值是可选的
  • [] 表示“这个数组的另一个元素”,

他们还试探性地建议了以下规则,我将为您提供以下选择: - 不带 [] 的参数在提交时会覆盖其以前的版本(并非所有网络服务器都遵循这一点,顺便说一下,这是 HTTP 碎片/污染攻击的问题)

我们将按照这个确切的结构进行解析,假设内容已经正确地进行了字符编码。代码的开头应该是这样的:

var myObj = {};
var k = myPostbackContent.split("&");
for (var i = 0; i < k.length; i++) {
  var kinfo = k[i].split("=");
  var key = kinfo[0];
  if (kinfo[1] !== undefined) {
     var value = kinfo[1];
  };
  if (key.substr(-2) == "[]") {
     key = key.substr(0,key.length-2);
     if (myObj[key] === undefined) myObj[key] = [];
     if (myObj[key] instanceof Array) myObj[key].push(value);
  }
  else {

以下部分取决于您的假设:

  • 如果您希望您的元素相互覆盖,请在else 中输入以下版本:

      myObj[key] = value;
    
  • 如果您希望元素的第一个实例具有优先权,请输入以下内容:

     if (myObj[key] === undefined) myObj[key] = value;
    
  • 如果像 IIS 一样,您希望将元素自动附加到由 , 分隔的字符串中,请使用以下命令:

     if (myObj[key].length) myObj[key] += ",";
     myObj[key] += value;
    

我已经构建了一个小的 TinkerIO 脚本来向您展示这三个是如何工作的。如果这不是您想要的,请告诉我。顺便说一句,默认行为是“覆盖”。

顺便说一句,这个方法可以反向应用,从一个对象到一个 URI 编码的字符串。只需遍历对象的属性并按 key=value 进行,用 & 连接所有元素。

【讨论】:

    【解决方案2】:

    只要你的文本参数总是在字符串的末尾,你就可以这样做:

    var obb = {};
    obb.name = text.match(/name=([^&]+)/)[1];
    obb.date = text.match(/date=([^&]+)/)[1];
    obb.text = text.match(/text=(.+)/)[1];
    

    DEMO

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-16
      • 2014-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多