Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将任意JavaScript代码存储到字符串变量中_Javascript_Java_Clojure_Nashorn - Fatal编程技术网

将任意JavaScript代码存储到字符串变量中

将任意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编写),它将一些JS代码注入JS函数,然后通过Nashorn对其进行求值。我无法控制代码传递(它可能包含引号、简单引号…)

看起来是这样的:

;; 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);
}
这适用于简单的程序,例如if
arbiryjs=“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生成的