如何取消转义JavaScript字符串文字值?

5
我将使用 来解析 代码(由于技术环境限制,无法使用 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>"');

2
看起来你需要使用类似于replace的东西。请参考https://dev59.com/jGw15IYBdhLWcg3wZq1r。 - Chris Lear
2个回答

2

您正在寻找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时仍需考虑安全性(参见:当JavaScript的eval()不邪恶时?)。此外,您的正则表达式足够宽松,可以捕获任何带引号的字符串。如果需要,您可以使用/"[^"]+"/g;但如果要将其限制为包含反斜杠的字符串,则应使用类似于/"[^"]*\\+[^"]*"/g的模式。 - gfullam

0

最愚蠢的方法是。

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

更聪明的方法是先取消转义 \n,然后使用正则表达式检查是否存在未转义的匹配项,然后再将它们转义。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接