我的网址看起来像:
http://example.com/whatever#page?x=1&locale=hu&y=2
http://example.com/whatever#page?x=1&locale=hu
http://example.com/whatever#page?locale=hu
http://example.com/whatever#page?locale=
http://example.com/whatever#page?x=1
http://example.com/whatever#page
http://example.com/whatever
如果没有设置,我想获取locale参数或空字符串。
我正在尝试这样的事情:
locale = location.hash.replace(/.*(?:[?&]locale=([^&]*))?.*/, "$2");
但我的问题是我找不到适用于所有情况的正确的RegExp(当哈希中的locale =和没有时)
答案 0 :(得分:15)
这是一段代码,它将从哈希中提取它并避免在URL中的任何其他地方使用它:
function getLocaleFromHash(url) {
var match = url.match(/#.*[?&]locale=([^&]+)(&|$)/);
return(match ? match[1] : "");
}
并且,您可以在此处看到它适用于您的所有测试用例:http://jsfiddle.net/jfriend00/p37Mx/
如果您希望能够在哈希中查找任何parm,您可以使用:
function getParmFromHash(url, parm) {
var re = new RegExp("#.*[?&]" + parm + "=([^&]+)(&|$)");
var match = url.match(re);
return(match ? match[1] : "");
}
在此处查看:http://jsfiddle.net/jfriend00/6kgUk/
将获取URL中所有参数的更通用的函数将如下所示。对于哈希在查询之后且参数在查询字符串中的普通URL,它看起来像这样。这是更多的代码,因为它做得更多。它将所有参数提取到一个对象中,您可以通过它的键查找任何参数,并且URL也对它们进行解码:
function getParmsFromURL(url) {
var parms = {}, pieces, parts, i;
var hash = url.lastIndexOf("#");
if (hash !== -1) {
// remove hash value
url = url.slice(0, hash);
}
var question = url.lastIndexOf("?");
if (question !== -1) {
url = url.slice(question + 1);
pieces = url.split("&");
for (i = 0; i < pieces.length; i++) {
parts = pieces[i].split("=");
if (parts.length < 2) {
parts.push("");
}
parms[decodeURIComponent(parts[0])] = decodeURIComponent(parts[1]);
}
}
return parms;
}
对于处理哈希值中的参数以及之后的特殊版本?在OP问题中的哈希值(这不是典型情况),可以使用:
function getParmsFromURLHash(url) {
var parms = {}, pieces, parts, i;
var hash = url.lastIndexOf("#");
if (hash !== -1) {
// isolate just the hash value
url = url.slice(hash + 1);
}
var question = url.indexOf("?");
if (question !== -1) {
url = url.slice(question + 1);
pieces = url.split("&");
for (i = 0; i < pieces.length; i++) {
parts = pieces[i].split("=");
if (parts.length < 2) {
parts.push("");
}
parms[decodeURIComponent(parts[0])] = decodeURIComponent(parts[1]);
}
}
return parms;
}
工作演示:http://jsfiddle.net/jfriend00/v8cd5/
然后,如果你想要本地选项,你就可以这样做:
var parms = getParmsFromURL(url);
var locale = parms["locale"];
答案 1 :(得分:2)
locale = location.hash.match( /[?&]locale=([^&]*)?/ );
locale = ( locale == null ? "" : locale[1] || "" );
会做的伎俩。我认为不需要.*
,因为您没有指定字符串的开头或结尾。
我在所有示例中测试了这个正则表达式,它们都正常工作:)
编辑:抱歉,在某些情况下无效。现在它在所有情况下都是正确的。
答案 2 :(得分:0)
如果你真的想在一个正则表达式中做到这一点:
locale = location.hash.match(/([?&]locale=|^((?![?&]locale=).)+$)([^&]*)/)[3];
它可以解决你的所有例子,但我认为它的效率非常低。