2

我的网址将如下所示:

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 = location.hash.replace(/.*(?:[?&]locale=([^&]*))?.*/, "$2");

但我的问题是我找不到适用于所有情况的正确正则表达式(当哈希中有 locale= 和没有时)

4

3 回答 3

16

这是一段代码,它将从哈希中提取它并在 URL 中的其他任何地方避免它:

function getLocaleFromHash(url) {
    var match = url.match(/#.*[?&]locale=([^&]+)(&|$)/);
    return(match ? match[1] : "");
}

而且,您可以在这里看到它适用于所有测试用例:http: //jsfiddle.net/jfriend00/p37Mx/


如果您希望能够在哈希中查找任何参数,您可以使用:

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"];
于 2012-05-16T19:07:00.553 回答
2
locale = location.hash.match( /[?&]locale=([^&]*)?/ );
locale = ( locale == null ? "" : locale[1] || "" );

会成功的。我认为.*不需要,因为您没有指定字符串的开头或结尾。我在你所有的例子上测试了这个正则表达式,它们都正常工作:)

编辑:对不起,在某些情况下它是无效的。现在在所有情况下都是正确的。

于 2012-05-16T19:02:08.527 回答
0

如果你真的想在一个正则表达式中做到这一点:

locale = location.hash.match(/([?&]locale=|^((?![?&]locale=).)+$)([^&]*)/)[3];

它适用于您的所有示例,尽管我认为它的效率非常低。

于 2012-05-16T19:41:39.633 回答