【问题标题】:How to unescape JavaScript string literal value?如何对 JavaScript 字符串文字值进行转义?
【发布时间】:2016-02-23 14:14:31
【问题描述】:

我正在使用 解析 代码(使用 ES 解析器,例如 Esprima,不是技术环境限制的选项)。

主题代码(被解析的代码是):

(function() {
    $('#3bf779cd').replaceWith("<div class=\'shows\'>\n<\/div>");

    window.fadeItems();
}).call(this);

我感兴趣的值是replaceWith的第一个参数,是一个字符串字面量。我正在使用正则表达式获取此变量:

const subjectValue = subjectCode.match(/\.replaceWith\(((["'])(?:(?=(\\?))\3.)*?\2)/m)[1].slice(1, -1);

console.log(subjectValue);

这个输出是:

<div class=\'shows\'>\n<\/div>

如何以输出如下的方式转义 subjectValue

<div class='shows'>
</div>

简单地使用unescape没有任何效果。

如果我没记错的话,问题在于如何取消这个值:

console.log('"<div class=\\\'shows\\\'>\\\\n<\\\/div>"');

【问题讨论】:

标签: regex javascript javascript regex


【解决方案1】:

您正在寻找eval(是的,您没听错):

text = document.querySelector('script').textContent;

dqString = /"(\\.|[^"])*"/g

s = text.match(dqString)[0]

raw = eval(s);

alert(raw);
<script>
(function() {
    $('#3bf779cd').replaceWith("<div class=\'shows\'>\n<\/div>");
    window.fadeItems();
});
</script>

【讨论】:

  • 这是一种有趣(且有效)的方法,但仍然需要考虑安全使用eval(请参阅:When is JavaScript's eval() not evil?。此外,您的正则表达式足够松散,可以捕获任何引用的"字符串。如果需要,您可以使用/"[^"]+"/g;但如果您想将其限制为包含反斜杠的字符串,您应该使用类似于/"[^"]*\\+[^"]*"/g的模式
【解决方案2】:

最愚蠢的方法是。

"<div class=\\'shows\\'>\\\\n<\\/div>".replace(/\\n/g, '').replace(/\\/g, '');
// "<div class='shows'></div>"

如果有未转义的匹配项,更明智的方法是首先取消转义 \n,而不是使用正则表达式检查,然后再转义这些匹配项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-26
    • 1970-01-01
    • 2015-11-17
    • 2012-11-10
    • 2011-08-28
    • 2015-07-06
    • 1970-01-01
    • 2018-07-19
    相关资源
    最近更新 更多