将任意JavaScript代码存储到字符串变量中
我有一个程序(用Clojure编写),它将一些JS代码注入JS函数,然后通过Nashorn对其进行求值。我无法控制代码传递(它可能包含引号、简单引号…) 看起来是这样的:将任意JavaScript代码存储到字符串变量中,javascript,java,clojure,nashorn,Javascript,Java,Clojure,Nashorn,我有一个程序(用Clojure编写),它将一些JS代码注入JS函数,然后通过Nashorn对其进行求值。我无法控制代码传递(它可能包含引号、简单引号…) 看起来是这样的: ;; Clojure (eval-str (str "print(evaluateCode(\"" s " \"))")) // equivalent code in pseudo-js just for those not reading Clojure fluently evalJS("println(evaluate
;; Clojure
(eval-str (str "print(evaluateCode(\"" s " \"))"))
// equivalent code in pseudo-js just for those not reading Clojure fluently
evalJS("println(evaluateCode(" + arbitraryJS + "))")
evaluateCode
功能已加载
// already loaded in Nashorn
function evaluateCode(code) {
// do something with the code
//...
eval(code);
}
这适用于简单的程序,例如ifarbiryjs=“var a=123;print(a);return a;”
但一旦程序包含引号,它就会中断。例如,“变量a=123;打印(“a现在是”,a);”
注意:实际代码是。您需要转义字符串。在每个“”之前放置一个\。 如果需要\本身,请将其加倍使用\\
很抱歉,我还不允许发表评论…:/您需要转义字符串。请在“每个”之前放置一个\。 如果需要\本身,请将其加倍使用\\
对不起,我还不能发表评论…:/ 我建议避开引号和反斜杠。我会选择单引号作为JS字符串分隔符,因为在Clojure中,您必须使用双引号来分隔字符串:
;; Clojure
(eval-str (str "print(evaluateCode('"
(clojure.string/replace s #"(['\\\\])" "\\\\$1")
"'))"))
查找和替换模式都有四个反斜杠。正如Clojure中的反斜杠是转义字符一样,它们实际上只表示两个反斜杠。在正则表达式中,反斜杠也是一个转义字符,所以最后它们只表示一个反斜杠。这意味着“在任何反斜杠或引号前面加上反斜杠。”
您不应该担心注释和模板等,因为转义字符只存在于Clojure中(在替换之后),而是在Javascript引擎解析完整字符串时解析。evaluateCode函数将永远不会看到转义字符,而是s的普通值
示例
;; Clojure
(def s "a = 'test'; // 'test' used here")
(eval-str (str "print(evaluateCode('"
(clojure.string/replace s #"(['\\\\])" "\\\\$1")
"'))"))
这将评估:
(eval-str "print(evaluateCode('a = \\'test\\'; // \\'test\\' used here'))")
请注意,在上述表示中,反斜杠加倍,但这是因为Clojure需要这样做。实际字符串仅出现一次反斜杠。如果不调用eval str
,而是使用相同的参数调用println
,则会得到以下输出:
打印(evaluateCode('a=\'test\';此处使用的/\'test\'))
这是Javascript引擎解释的字符串,因此它将反斜杠解释为转义字符,将干净的字符串传递给evaluateCode
因此,如果evaluateCode看起来像这样:
function evaluateCode(code) {
alert(code);
}
它将生成此警报:
a=‘测试’;/’这里使用的“测试”
因此,Javascript中根本不存在转义反斜杠。它将看到与Clojure符号s表示的值完全相同的值。我建议避开引号和反斜杠。我会选择单引号作为JS字符串分隔符,因为在Clojure中,您必须使用双引号来分隔字符串:
;; Clojure
(eval-str (str "print(evaluateCode('"
(clojure.string/replace s #"(['\\\\])" "\\\\$1")
"'))"))
查找和替换模式都有四个反斜杠。正如Clojure中的反斜杠是转义字符一样,它们实际上只表示两个反斜杠。在正则表达式中,反斜杠也是一个转义字符,所以最后它们只表示一个反斜杠。这意味着“在任何反斜杠或引号前面加上反斜杠。”
您不应该担心注释和模板等,因为转义字符只存在于Clojure中(在替换之后),而是在Javascript引擎解析完整字符串时解析。evaluateCode函数将永远不会看到转义字符,而是s的普通值
示例
;; Clojure
(def s "a = 'test'; // 'test' used here")
(eval-str (str "print(evaluateCode('"
(clojure.string/replace s #"(['\\\\])" "\\\\$1")
"'))"))
这将评估:
(eval-str "print(evaluateCode('a = \\'test\\'; // \\'test\\' used here'))")
请注意,在上述表示中,反斜杠加倍,但这是因为Clojure需要这样做。实际字符串仅出现一次反斜杠。如果不调用eval str
,而是使用相同的参数调用println
,则会得到以下输出:
打印(evaluateCode('a=\'test\';此处使用的/\'test\'))
这是Javascript引擎解释的字符串,因此它将反斜杠解释为转义字符,将干净的字符串传递给evaluateCode
因此,如果evaluateCode看起来像这样:
function evaluateCode(code) {
alert(code);
}
它将生成此警报:
a=‘测试’;/’这里使用的“测试”
因此,Javascript中根本不存在转义反斜杠。它将看到与Clojure符号s表示的值完全相同的值。在后面,我使用了,因为其他解决方案不起作用。请看。在后面,我使用了,因为其他解决方案不起作用。看到了。像\“?使用其他引号?
”
这样的引号转义怎么样?因为我认为您会在今年创建新的字符串文本way@Berger我认为可能会有一些极端情况(我想到了模板字符串,可能会有评论)?@Thomas-well我应该强调任意代码,它可能也包含简单的引号。如何转义像\“?使用其他引号“
,因为我认为您将在今年创建新的字符串文本way@Berger我想可能会有一些极端情况(我想到的是模板字符串,可能是注释)?@Thomas well我应该强调任意代码,其中可能也包含简单的引号。我同样回复了@Berger,但你会如何处理极端情况(如果有的话)?我在考虑注释、模板字符串,但可能还有其他注释。注释使用常规斜杠,应该不会有问题。对于换行符转义,\n:模板字符串似乎也能正常工作。Yust试一试:var n=“var x=0;//设置var\n console.log(x);var b=`Hi\n${2+13}!`;console.log(b)/*dose stuff*/”
对于评论,我的想法更像:var a=“abc”,b='abc;/*“a”和“b”都是变量*/\n'
。或者可能var a=“abc”,b=“abc`这是一个模板字符串。我可以包含“引号”吗?它们应该被再次引用吗?`
;套利代码从何而来?如果其存储为字符串,则应按预期工作。如果它是由t生成的