【问题标题】:Query String parsing: Handling both & and ;查询字符串解析:同时处理 & 和 ;
【发布时间】:2013-01-27 00:12:31
【问题描述】:

我在 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("&"),如果没有找到,将分隔符设置为;

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

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

我们建议 HTTP 服务器实现者,尤其是 CGI 实现者支持使用“;”代替“&”来保存作者 以这种方式转义“&”字符的麻烦。

这里是 RFC 1738,它定义了 URI。

【问题讨论】:

  • @VisioN 不,因为据我所知,那里接受的答案不处理 ; 分隔符。
  • 使用分号作为分隔符已经过时了很长时间。你还在看他们吗?
  • 它可能已过时,但未删除。是的,我还在看他们。例如,OTRS 使用它们。
  • W3C working draft 声明 & 是 URL 参数的唯一分隔符。

标签: javascript url query-string


【解决方案1】:

您可以使用 reg ex 在两个分隔符上进行拆分。

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

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

编辑:

here 是一个帖子,可以根据角色的第一次出现来拆分一个或另一个。希望 URL 首先包含分号,但检查是否出现 ; 可能更安全。如果存在,只需将其用作分隔符。

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

我会无畏你的例子

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

作为

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

【讨论】:

  • 是的。但是,这是规范的意图,还是只是使用一个分隔符或另一个?例如,在我上面的示例中,它应该解析 Param1、Param2 和 Param3,还是只是将 Param3 解释为 Param2 的一部分的 Param1 和 Param2,因为分隔符设置为 &
  • @crush 只要匹配其中任何一个字符,就会分裂。
  • @Mathletics 我了解他的代码的作用。我在问规范需要什么。
  • @crush 规范是为了什么? URL参数化,还是split方法?
  • @Mathletics W3C 处理&; 的规范和建议。目前尚不清楚您是否应该将两者分开或将第一次出现的一个视为从该点向前的分隔符。例如案例:index.php?Param1=value&Param2=value;Param3=value。规范是说这是三个参数,还是只有两个参数,第二个参数是Param2=value;Param3=value
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-03
  • 2011-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多