2012-12-01 56 views
2

目标是解析嵌入在URL的哈希部分中的参数。有人在StackOverflow社区提供了下面的代码作为对类似问题的回应。社区选择了这个代码作为一个合适的解决办法,因此它被集成到自己的代码如下:使用JavaScript正则表达式解析查询字符串

Utils.parseQueryStringArgs=function(queryString){ 
    var result = {}, queryString = queryString.substring(1), 
     re = /([^&=]+)=([^&]*)/g, m; 

    while (m = re.exec(queryString)) { 
      result[decodeURIComponent(m[1])] = decodeURIComponent(m[2]); 
    } 

    return result; 
} 

有正则表达式的零知识,上面的“重”变量是没有意义的我,但尚未结构该代码是有道理的。它完美地工作,直到窒息下列算式:

friendlySeriesName=Test%3A%20Fund.Feeder%20[class%20A]%20%26gt%3B%26gt%3B%20Morgan%2C%20Harry%20%40%201 

预期的行为是解析出的“friendlySeriesName”属性名称和“测试Fund.Feeder [A类] >>摩根,哈里的属性值@ 1“。然而,正在发生的事情是正确解析属性名称和“Test:Fund.Feeder [class A]”的解析值。除了大于号(“>>”)之外的所有内容都会被这个解析函数抛弃。

问题:你可以修改变量're'的值,使得上面的函数能够正确地在提供的示例表达式上正常工作,或者提供一种简单的方法从哈希表中解析出键值对一个编码的url字符串?

+1

我强烈建议不要使用该代码来分析查询字符串。查询字符串“?foo = bar&foo = baz”应该被解析为'['bar','baz']'。有[现有的JS库](http://medialize.github.com/URI.js/)可用于正确解析URI,并因此查询字符串。 – zzzzBov

回答

5

问题不在于JavaScript代码。问题是在查询字符串中提供的值。

某些代码某处编码>作为>第一(即,作为一个HTML字符实体),然后URI转义&符和分号离开%26gt%3b。卫生署!

FWIW,一个快速的“黑客”是先转换%26gt%3b%3e(或>):

// original stuff 
var result = {}, queryString = queryString.substring(1), 
    re = /([^&=]+)=([^&]*)/g, m; 
// hack 
queryString = queryString.replace(/%26gt%3b/g, "%3e"); 
// rest as normal 

这可能需要为其他有问题的初始编码来实现(如<&lt;&&amp; )以及。

+0

您的诊断是正确的。输入被编码两次。 –

相关问题