2017-10-28 8 views
0

文字列パラメータを受け取り、その中の変数参照(隣接する%で指定)を対応する変数値に置き換える関数を作成します。私は十分にeval()関数のリスクについて警告されていますが、代替手段が見つかりませんでした。私はこのコードがどれほど危険であるかわからない。それが問題であれば、どんなアプローチがより安全になるでしょう。ここでJS文字列の変数参照を変数の内容に置き換えます。

は私が持っているものである:MHソウザの勧告に基づいて

var a = 1; 
var b = 2; 
result = myFunction("a is %a%, b is %b%"); 
console.log(result); // return "a is 1, b is 2" 

function myFunction(text) { 
    // escape needed chars in text for regex 
    text = text.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); 
    var regExp = /%.+?%/g, 
     match; 
    while (match = regExp.exec(text)) { 
     rep = match[0].substr(1).slice(0, -1); // remove flanking %'s 
     text = text.replace(match[0], eval(rep)); 
    } 
    return text 
} 

、私はこれは動作するはずです考え出しが、出力は次のとおりです。

%a% a 
%b% b 
a is a, b is b 

var a = 1; 
 
var b = 2; 
 
result = myFunction("a is %a%, b is %b%"); 
 
console.log(result); 
 

 
function myFunction(text) { 
 
    // escape neede chars in text for regex 
 
    text = text.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); 
 
    var regExp = /%.+?%/g, 
 
    match; 
 
    while (match = regExp.exec(text)) { 
 
    var rep = match[0].substr(1).slice(0, -1); // remove flanking %'s 
 
    var rep = `${rep}`; 
 
    console.log(match[0], rep); 
 
    text = text.replace(match[0], rep); 
 
    } 
 
    return text 
 
}

+0

[テンプレートリテラル](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals)を使用できないような制約がありますか? –

+0

これまでにそれらを使用したことがなく、実装方法がわからないこと以外は、私は拘束を受けません。 – cycle4passion

答えて

3

あなたはTemplate Literalsを使用してこれを達成できます。あなたのケースでは

:あなたはこのようなあなたの文字列を記述する必要が

const a = 1; 
const b = 2; 
const result = `a is ${a}, b is ${b}`; // a is 1, b is 2 

: $: `マイSTRING`

そして、変数の値を連結するために、あなたはこのような変数を書きます{} myVariable変数

ので、最終的な結果は次のようになります。

const myVariable = 'awesome'; 
const finalResult = `My string is ${myVariable}` // My string is awesome 
+0

コードが上記で更新されましたが、私が期待するようにまだ解決していません。 – cycle4passion

関連する問題