检测&之间的差异和location.hash中的%26

时间:2009-03-06 15:30:18

标签: javascript

使用这个简单的javascript代码分析location.hash:

<script type="text/javascript">alert(location.hash);</script>

我很难分离出包含&amp;的GET变量。 (编号为%26)和&amp;用来分隔变量。

示例一:

  • 代码= PHP&安培;年龄= 15D

示例二:

  • 代码= PHP%20%26%20code&安培;年龄= 15D

正如您所看到的,示例1没有问题,但让javascript知道示例二中的“code = php&amp; code”超出了我的能力:

(注意:我并没有真正使用这些变量名称,只要搜索词与搜索键不匹配,将其更改为其他名称只会起作用,所以我不认为这是一个有效的解决方案。)

4 个答案:

答案 0 :(得分:4)

%26和&amp;之间没有区别在片段标识符('hash')中。 '&amp;'只是在URI的查询('搜索')段中具有特殊含义的保留字符。将'&amp;'转换为'%26'不需要提供应用程序级别的可见性,而不是将'a'转换为'%61'。

由于没有用于在片段标识符中隐藏结构化数据的标准编码方案,您可以创建自己的。例如,使用'+ XX'十六进制编码对组件中的字符进行编码:

hxxp://www.example.com/page#code=php+20+2B+20php&age=15d

function encodeHashComponent(x) {
    return encodeURIComponent(x).split('%').join('+');
}
function decodeHashComponent(x) {
    return decodeURIComponent(x.split('+').join('%'));
}

function getHashParameters() {
    var parts= location.hash.substring(1).split('&');
    var pars= {};
    for (var i= parts.length; i-->0;) {
        var kv= parts[i].split('=');
        var k= kv[0];
        var v= kv.slice(1).join('=');
        pars[decodeHashComponent(k)]= decodeHashComponent(v);
    }
    return pars;
}

答案 1 :(得分:1)

在Firefox 3.1上进行测试,看起来浏览器在填充location.hash变量时将十六进制代码转换为相应的字符,因此JavaScript无法知道原始字符是单个字符还是十六进制代码。< / p>

如果您正在尝试对像&amp;这样的字符进行编码在哈希变量中,我建议用另一个字符串替换它。

你也可以用奇怪的方式解析字符串,比如(JS 1.6 here):

function pairs(xs) {
  return xs.length > 1 ? [[xs[0], xs[1]]].concat(pairs(xs.slice(2))) : []
}

function union(xss) {
  return xss.length == 0 ? [] : xss[0].concat(union(xss.slice(1)));
}

function splitOnLast(s, sub) {
  return s.indexOf(sub) == -1 ? [s] : 
                                [s.substr(0, s.lastIndexOf(sub)),
                                 s.substr(s.lastIndexOf(sub) + sub.length)];
}

function objFromPairs(ps) {
  var o = {};
  for (var i = 0; i < ps.length; i++) {
    o[ps[i][0]] = ps[i][1];
  }
  return o;
}

function parseHash(hash) {
  return objFromPairs(
           pairs(
             union(
               location.hash
                       .substr(1)
                       .split("=")
                       .map(
                         function (s) splitOnLast(s, '&')))))
}

>>> location.hash
"#code=php & code&age=15d"
>>> parseHash(location.hash)
{ "code": "php & code", "age": "15d" }

答案 2 :(得分:0)

就像你对第一个例子做的那样,但是在对&amp;然后调用 unescape()将%26转换为&amp;和%20到空格。

编辑:

看起来我有点过时了你现在应该使用 decodeURIComponent(),虽然我没有看到任何关于它对 unescape有什么不同的明确解释( ),除了建议它不能正确处理Unicode。

答案 3 :(得分:0)

这对我来说很好:

var hash = [];
if (location.hash) {
 hash = location.href.split('#')[1].split('&');
}