JS用变量内容替换字符串中的变量引用

时间:2017-10-28 19:16:47

标签: javascript eval

我想创建一个函数,它接受一个字符串参数并用它们对应的变量值替换其中的变量引用(用flanking%'指定)。我已经充分警告eval()函数的风险,但还没有找到替代方案。我不确定这段代码有多危险。如果这是一个问题,哪种方法会更安全。

这就是我所拥有的:

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
}

根据MH Souza的建议,我认为这应该有效,但输出是:

%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
}

1 个答案:

答案 0 :(得分:3)

您可以使用Template Literals来实现此目的。

在你的情况下:

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

你只需要像这样编写你的字符串:  “我的字符串”

要连接变量值,您可以像这样编写变量: $ {MYVARIABLE}

所以,最终结果如下:

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