如何将查询字符串从HTML表单解析为键值对字符串?

时间:2018-08-22 15:53:06

标签: javascript jquery html forms

在我开发的一个Web应用程序中,我需要序列化表单,然后将查询字符串分成键值对,如下所述。

    var frmSerialized=$(frm).serialize().replace(/\+/g,'%20');      //The jquery libraries upto version 2.0 converts spaces to plus
    var frmKeyPair=decodeURIComponent(frmSerialized).split("&");

一切正常,直到发现以下两种情况为止:

  1. 当表单元素之一的值包含“&”时。例如

    <input name="fName" value="Sons & Co" type="hidden">

  2. 当表单元素之一的值包含“?”时。例如

    <input type="hidden" name="Questions" value = "A?b.=c">

在这些情况下,窗体序列化和拆分过程失败。在序列化然后拆分查询字符串时,有什么更好的选择?

编辑:此操作的主要目的是对参数进行加密,以防止Web参数被篡改。所以我实际上要做的是:

for(var j=0;j<frmKeyPair.length;j++){
        var mapInput;
        var element=frmKeyPair[j].split("=");
        var elemName=decodeURIComponent(element[0]);
        var eleValue=decodeURIComponent(element[1]);
        mapInput = document.createElement("input");
        mapInput.type = "hidden";
        mapInput.name = aesUtil.encrypt(salt, iv, passPhrase, elemName);
        mapInput.value = eleValue==null?"":aesUtil.encrypt(salt, iv, passPhrase, eleValue);
        mapForm.appendChild(mapInput);
    }

在这里,我使用GitHub中可用的CryptoJS库。 MapForm是一个动态创建的新HTML表单。加密完成后,我使用

提交
mapForm.submit();

1 个答案:

答案 0 :(得分:0)

您可以用&分割以获取它们的键值对,然后在解码值之前用'='分割它们。

var x = $( 'form' ).serialize().replace(/\+/g,'%20');

console.log( x );

x.split( '&' ).forEach(function(keyValue){
  var [ key, value ] = keyValue.split( '=' );
  
  console.log( key, ' = ', decodeURIComponent( value ) );
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form>
<input name="fName" value="Sons & Co" type="hidden">
<input type="hidden" name="Questions" value = "A?b.=c">
</form>