正则表达式提取查询字符串变量和值

时间:2009-09-22 13:11:49

标签: javascript regex query-string

我正在使用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);
    }
}

2 个答案:

答案 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")。

如果你没有在源头更改查询字符串(并正确地转义值组件),那么你只是在破解错误的解决方案。

祝你好运。