查询字符串解析:处理&和;

时间:2013-02-11 20:00:16

标签: javascript url query-string

我发现很多关于StackOverflow的文章提到了在Javascript中解析查询字符串的快速方法,但我没有找到的是如何将&;作为分隔符处理。

现在,我假设,其中只有一个被设置为查询字符串的分隔符。例如,以下查询字符串:

index.php?Param1=value&Param2=value;Param3=value

哪个是分隔符?

  • &,还是;
  • 它是第一个识别出的分隔字符,还是&优先于;
  • 是否都被视为分隔符,并且解析了示例中的所有三个参数?

在Javascript中,我历来使用以下功能:

/**
 * Gets the value of a parameter from a URI.
 * @param href The full URI to search. Must at least start with a ? query string delimiter.
 * @param key  The key of the param for which to retrieve the value.
 * @param def  A default value to return in the case that the key cannot be found in the query string.
 * @return The value of the param if the key is found, otherwise returns def.
 */
function getURIParam(href, key, def) {
    if (arguments.length == 2) def = null;

    var qs = href.substring(href.indexOf('?') + 1);
    var s = qs.split('&');
    for (var k in s) {
        var s2 = s[k].split('=');
        if (s2[0] == key)
            return decodeURIComponent(s2[1]);
    }

    return def;
}

这只是根据&拆分每个键/值对。它的效果很好,只要分隔符始终为&。但是,正如我们所知,情况并非总是如此,也不应该强制执行,因为RFC也允许;

因此,为了同时处理&;作为分隔符,我应该首先搜索indexOf("&"),如果没有找到,请将分隔符设置为{{1 }}?

根据分隔符可以是;还是&的规则解析URL的正确方法是什么?

以下是服务器上的W3C Recommendation能够同时处理;&

  

我们建议使用HTTP服务器实现者,特别是CGI   实现者支持使用“;”取代“&”保存作者   逃避“&”的麻烦这种方式的人物。

这是定义URI的RFC 1738

1 个答案:

答案 0 :(得分:1)

您可以使用reg ex分割两个分隔符。

var s = qs.split(/[&;]/)

这将处理带有和&的字符串。和;

编辑:

here是一个在一个或另一个上分裂的帖子,因为第一次出现该角色。希望URL首先包含分号,但检查是否有任何出现可能更安全;并且只使用它作为分隔符(如果存在)。

根据RFC3986,由方案实现者决定如何使用URI保留字符的使用。另外根据RFC 1738,分号是URI的搜索部分中的保留字符,因此,如果存在,则被视为分隔符,除非编码。服务器实现者允许的W3C recommends两者都允许开发人员不必逃避&符号,因此应该使用其中一个。

我会强悍你的

的例子
index.php?Param1=value&Param2=value;Param3=value

as

["Param1=value&Param2=value","Param3=value"]