0

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

非常感谢。

4

6 回答 6

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();'
于 2012-05-01T08:40:18.600 回答
2

单步执行您的代码:

def convert(jsstring=''):
    return 'function dosomething () { return %s.toLowerCase(); }' % jsstring

现在,如果jsstring"Foo",它会产生什么?

function dosomething () { return Foo.toLowerCase(); }

当然这会失败。Foojavascript 函数中没有名为 set 的变量。

十有八九,你想要一个字符串文字:

def convert(jsstring=''):
    return 'function dosomething () { return "%s".toLowerCase(); }' % jsstring

jsstring当然,如果包含引号、换行符和其他敏感字符,您需要确保不会出错。我会把它留给你。

于 2012-05-01T08:40:35.910 回答
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。

于 2012-05-01T08:50:41.613 回答
2

在字符串插值中使用 repr:

>>> 'This is a string: %r' % ('python string')
'This is a string: "python string"'

因此,只需在代码中将 %s 替换为 %r 即可。repr()将为您完成工作。

于 2012-05-01T08:55:50.877 回答
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(); }\''
于 2012-05-01T08:48:11.003 回答
1

使用repr,否则如果字符串包含 " 或 ',您的字符串将不起作用。例如:

... % repr(jsstring)

使用失败repr也可能是一个安全漏洞(通过注入 " 或 ' 或其他字符)。repr如果您的字符串包含这些字符,使用失败也可能导致您的 javascript 失败。虽然如果安全是一个问题,您还需要通过适当的转义系统避免文本</script>和其他内容,或将其编码为 base64 之类的内容。

于 2012-05-01T08:48:48.737 回答