2

私のURLは次のようになります:

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");

しかし、私の問題は、すべてのケースで機能する適切な RegExp を見つけることができなかったことです (ハッシュに 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

本当に1つの正規表現でそれを実行したい場合:

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

それはあなたのすべての例に対して機能しますが、それはひどく非効率的だと思います。

于 2012-05-16T19:41:39.633 に答える