1

Webで次のJSを見つけました。

url params の値を取得する関数です。

function get_url_param(param) {
  param = param.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
  var regexS = "[\\?&]"+param+"=([^&#]*)";
  var regex = new RegExp( regexS );
  var results = regex.exec(window.location.href);
  if( results == null )
    return '';
  else
    return results[1];
}

しかし、私はexec()関数を見るといつもこう思います。

だから私の質問は:それは安全ですか?

副次的な賭け: この機能が最悪で、より良いオプションがあると思われる場合は、遠慮なく共有してください :)

上記の関数は実際の URL を使用しますが、URL を含む文字列のみを解析する必要があります。

4

3 に答える 3

4

関数に表示されるの.exec()は、ウィンドウではなくRegExpオブジェクトです。

なので、全然問題なく使えます。

于 2011-08-04T20:23:06.597 に答える
3

正規表現execeval. 少し不格好ですが、うまくいくはずです。

于 2011-08-04T20:25:06.643 に答える
2

Regexp#exec非常に優れたインターフェースではありませんが、安全です。

副次的な賭け: この機能が最悪で、より良いオプションがあると思われる場合は、遠慮なく共有してください :)

うん:-)

param = param.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");

これはローバル正規表現を使用しないため、g各ブラケットの 1 つのインスタンスのみを置き換えます。field[][]うまくいきません。また、キャラクターグループは必要ありません...param.replace(/\[/g, '\\[')うまくいったでしょう。または、非正規表現の置換イディオムparam.split('[').join('\\[').

それで:

var regexS = "[\\?&]"+param+"=([^&#]*)";

それらを正規表現にドロップして、文字通りの自己を意味させることができるほど十分な文字をエスケープしていません。より水密な代替手段については、この質問を参照してください。

とにかく、この種の正規表現ハッキングは、依然として URL/クエリ文字列を解析する良い方法ではありません. ;これは、または%-encoding、または+スペースを適切に処理しません。また、URL の他の場所でパラメーターが類似している場合にトリップする可能性があります。

代わりに、最初にクエリ文字列を単独で取得しましょう。リンクまたはロケーション オブジェクトがある場合は、.searchプロパティから取得できます。文字列 URL しかない場合は、それをリンク オブジェクトに変換して、これを確実に取得できます。

function getQueryString(url) {
    var a= document.createElement('a');
    a.href= url;
    return a.search;
}

これで、先頭の をドロップし、または?で分割してから、URL でデコードされた結果を JS オブジェクトにドロップすることで解析できます。&;

function parseQuery(query) {
    var lookup= {};
    var params= query.slice(1).split(/[&;]/);
    for (var i= 0; i<params.length; i++) {
        var ix= params[i].indexOf('=');
        if (ix!==-1) {
            var name= decodeURIComponent(params[i].slice(0, ix));
            var value= decodeURIComponent(params[i].slice(ix+1));
            if (!(name in lookup))
                lookup[name]= [];
            lookup[name].push(value);
        }
    }
    return lookup;
}

これにより、パラメータを簡単に検索できます。

var url= 'http://www.example.com/?a=b&c=d&c=%65;f[]=g#h=i';
var pars= parseQuery(getQueryString(url));

alert(pars.a);      // ['b']
alert(pars.c);      // ['d', 'e']
alert(pars['f[]']); // ['g']
alert('h' in pars); // false

パラメータの複数の値を読み取る必要がない場合lookup[name]= valueは、if...[]...pushダンスの代わりに、リストではなくルックアップで単一の文字列値を返すことができます。

于 2011-08-04T21:47:03.720 に答える