我使用regex来解析javascript代码(使用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>"');
答案 0 :(得分:2)
您正在寻找eval
(是的,您没听错):
text = document.querySelector('script').textContent;
dqString = /"(\\.|[^"])*"/g
s = text.match(dqString)[0]
raw = eval(s);
alert(raw);
&#13;
<script>
(function() {
$('#3bf779cd').replaceWith("<div class=\'shows\'>\n<\/div>");
window.fadeItems();
});
</script>
&#13;
答案 1 :(得分:0)
最愚蠢的方式是。
"<div class=\\'shows\\'>\\\\n<\\/div>".replace(/\\n/g, '').replace(/\\/g, '');
// "<div class='shows'></div>"
更聪明的方法是首先进行unescape \ n而不是检查正则表达式是否有未转义的匹配,而不是逃避它们。