0

多くの正規表現を使用する次のJavaScript関数があります。これを簡単にする方法はありますか?

function encode(str){
    if(typeof str==='number'){
        return str;
    }
    if(typeof str!=='string'){
        return '';
    }
    var enc=str;
    enc=enc.replace(/_/g,'_u');  //underscore
    enc=enc.replace(/(\r\n|\r|\n)/g,'_r'); //return
    enc=enc.replace(/&/g,'_a');  //ampersand
    enc=enc.replace(/\\/g,'_b'); //backslash
    enc=enc.replace(/:/g,'_c');  //colon
    enc=enc.replace(/"/g,'_d');  //double quote
    enc=enc.replace(/=/g,'_e');  //equals
    enc=enc.replace(/€/g,'_4');  //euro
    enc=enc.replace(/\>/g,'_g'); //greater than
    enc=enc.replace(/#/g,'_h');  //hash
    enc=enc.replace(/'/g,'_i');  //inverted comma
    enc=enc.replace(/\</g,'_l'); //less than
    enc=enc.replace(/¬/g,'_n');  //not
    enc=enc.replace(/\|/g,'_1'); //pipe
    enc=enc.replace(/¦/g,'_2');  //broken pipe
    enc=enc.replace(/\+/g,'_p'); //plus
    enc=enc.replace(/£/g,'_3');  //pound
    enc=enc.replace(/\?/g,'_q'); //question mark
    enc=enc.replace(/\//g,'_s'); //slash
    enc=enc.replace(/\~/g,'_t'); //tlide
    enc=enc.replace(/\`/g,'_z'); //back quote
    enc=enc.replace(/\s/g,'_0'); //space
    enc=enc.replace(/[\u0000-\u001f]/g,'');
    return enc;
};
4

2 に答える 2

3

「パターン」から「置換」へのマップを作成する代わりに、「置換する文字列」から「置換」へのマップを作成し、コールバックで単一の置換関数を使用できます。

var map = {
    "_": "_u",
    "\r\n": "_r",
    "\r": "_r",
    "\n": "_r",
    "&": "_a",
    /* .. etc .. */
};

enc = enc.replace(
        /\r\n|[_\r\n&\\:"=€&gt;#'<¬|¦+£?\/~`\s\u0000-\u001f]/g,
        function(m) {
            return map[m[0]];
        }
);

このアプローチは、固定文字列にならない置換パターンを追加するとすぐに失敗します (+またはのような量指定子を使用するため*)。

ただし、実際にはほとんどのブラウザーで大幅に高速です。この JSPerfを参照してください。

それ以外には、条件付き置換を行う方法はありません (これは、さらに最適化するために必要なものです)。

于 2013-08-16T09:55:43.890 に答える
1

次のようなことができます。

var map = {
    "_": "_u",
    "(\r\n|\r|\n)": "_r",
    "&": "_a",
    /* .. etc .. */
};
var i;
var enc = "_abc&";
for (i in map) {
    enc = enc.replace(new RegExp(i, "g"), map[i]);
}
console.log(enc); // _uabc_a

new RegExp正規表現を作成できないため、使用しました。区切り文字 ( ) は必要なく/、修飾子 ( g) は別の場所にあることに注意してください。

于 2013-08-16T09:35:41.940 に答える