我想用python动态生成javascript代码。
def convert(jsstring=''):
return 'function dosomething () { return %s.toLowerCase(); }' % jsstring
问题是jsstring
是一个python字符串。
如何将其转换回javascript字符串文字以使dosomething
成为有效的javascript函数?
例如
呼叫
convert("javascript")
现在输出
function dosomething () { return javascript.toLowerCase(); }
这不是有效的javascript函数
预期产出
function dosomething () { return "javascript".toLowerCase(); }
另一个例子,请致电
convert("javascript\'")
预期产出
function dosomething () { return "javascript\'".toLowerCase(); }
非常感谢。
答案 0 :(得分:2)
如何在%s
周围添加适当的引号,即:
'function dosomething () { return "%s".toLowerCase(); }' % jsstring
这是一个命令行会话,以澄清差异:
In [10]: joe = 'somestring'
In [11]: '%s.toLowerCase();' % joe
Out[11]: 'somestring.toLowerCase();'
In [12]: '"%s".toLowerCase();' % joe
Out[12]: '"somestring".toLowerCase();'
答案 1 :(得分:2)
逐步执行代码:
def convert(jsstring=''):
return 'function dosomething () { return %s.toLowerCase(); }' % jsstring
现在,如果jsstring
是"Foo"
,它会产生什么?
function dosomething () { return Foo.toLowerCase(); }
当然这会失败。在javascript函数中没有设置名为Foo
的变量。
很可能,你想要一个字符串文字:
def convert(jsstring=''):
return 'function dosomething () { return "%s".toLowerCase(); }' % jsstring
当然,如果jsstring
包含引号,换行符和其他敏感字符,则需要确保没有任何问题。我会留给你的。
答案 2 :(得分:2)
您想要json:
import json
jsstring = """
foo "bar"
"""
print 'function dosomething () { return %s.toLowerCase(); }' % json.dumps(jsstring)
建议的repr
不适用于unicode字符串:
jsstring = u"\u1234"
print 'function dosomething () { return %s.toLowerCase(); }' % repr(jsstring)
返回
function dosomething () { return u'\u1234'.toLowerCase(); }
这是无效的javascript。
答案 3 :(得分:2)
在字符串插值中使用repr:
>>> 'This is a string: %r' % ('python string')
'This is a string: "python string"'
所以只需在代码中用%r替换%s即可。 repr()
将为您完成工作。
答案 4 :(得分:1)
你最好恰当地引用字符串你传递给函数的内容。这将使事情变得简单
对于上面提到的例子
>>> convert('"javascript"')
'function dosomething () { return "javascript".toLowerCase(); }'
如果您想传递带引号的字符串,请适当地转义它
>>> print convert("\"javascript\"\"")
function dosomething () { return "javascript"".toLowerCase(); }
请记住,如果您想要原始表示,请始终使用repr
,您将得到您想要的内容
>>> repr(convert("\"javascript\"\""))
'\'function dosomething () { return "javascript"".toLowerCase(); }\''
或保持透明,在函数内添加repr。
>>> def convert(jsstring=''):
return repr('function dosomething () { return %s.toLowerCase(); }' % jsstring)
>>> convert("\"javascript\"\"")
'\'function dosomething () { return "javascript"".toLowerCase(); }\''
答案 5 :(得分:1)
使用repr
,否则如果字符串包含“或”,则字符串将无效。例如:
... % repr(jsstring)
未能使用repr
也可能是一个安全漏洞(通过注入“或”或其他字符)。如果您的字符串包含这些字符,则无法使用repr
也可能导致您的javascript失败虽然如果安全性是一个问题,你也需要通过一个适当的转义系统来避免像</script>
这样的文本和其他东西,或者用类似base64编码它。