我正在使用Javascript并尝试从其值中分出查询字符串变量。我制作了一个正常的正则表达式,除了表示变量之外没有其他的&符号,否则数据在&符号中被切断。
示例:ajax=10&a=test&b=cats & dogs
返回a = "test"
,b = "cats "
由于此项目的性质以及在输入时在数百个位置编码/替换字符的效率低下,我无法在字符串生成之前编码&符号。
这段代码应该最终做的是将查询字符串ajax=10&a=cats & dogs
转换为ajax=10&a=cats%20%26%20dogs
list = [ 'ajax','&obj','&a','&b','&c','&d','&e','&f','&g','&h','&m' ];
ajax_string = '';
for (var i=0, li=list.length; i<li; i++) {
variables = new RegExp(list[i] +"=([^&(.+)=]*)");
query_string = variables.exec(str);
if (query_string != null) {
alert(query_string);
}
}
答案 0 :(得分:3)
查询字符串应<&em>在&符号上拆分。实际参数值中的任何&符号都应转换为%26。
这是您发布的的查询字符串的样子:
ajax=10&a=test&b=cats+%26+dogs
您发布的的查询字符串应该为您提供:
'ajax': '10' 'a': 'test' 'b': 'cats ' ' dogs': ''
看起来您实际上想要清理其他开发人员懒惰构建的查询字符串。如果我们假设:a)每个参数名称匹配/ [a-zA-Z0-9] + /;和b)它后面总是跟一个等号,然后这个代码就可以了:
var queryString = 'ajax=10&a=test&b=cats & dogs';
var parts = queryString.split(/&(?=[a-zA-Z0-9]+\=)/);
for(var i = 0; i < parts.length; i++)
{
var index = parts[i].indexOf('=') + 1;
if(index > 0)
parts[i] = parts[i].substring(0, index) + escape(parts[i].substring(index));
//else: error?
}
queryString = parts.join("&");
alert("queryString: " + queryString);
答案 1 :(得分:1)
&GT;由于该项目的性质,我无法在字符串生成之前对&符号进行编码
然后你就没有完整的答案。
Ampersands ("&"
) separate query parameters in url query strings。在某些查询参数值包含未转义的"&"
并且期望基于此简单规则的解析器知道差异时,您不能同时使用它。
如果您事先无法在每个值组件中将"&"
转换为"%26"
,那么您永远不能知道您获得的值是正确的。您可以做的最好的事情是:如果"&"
右侧和下一个"&"
之前的值不包含等号"="
,则追加读取前一个值的值,如果这是读取的第一个值,则为空字符串。
这需要一个合适的解析器,因为JavaScript不支持可以帮助您执行此操作的超前正则表达式。
但请注意,这样的算法完全绕过了规范。假设查询字符串:
a=test&b=cats & dogs&c=test
有效,从技术上讲,该字符串包含 4 参数:"a"
(值为"test"
),"b"
(值为{{1 }}),"cats "
(没有值)和" dogs"
(值"c"
)。
如果你没有在源头更改查询字符串(并正确地转义值组件),那么你只是在破解错误的解决方案。
祝你好运。