python将str转换为javascript文字字符串

时间:2012-05-01 08:27:58

标签: javascript python

我想用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(); }

非常感谢。

6 个答案:

答案 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编码它。