Python 将 str 转换为 JavaScript 文字字符串

python convert str to javascript literal string

本文关键字:JavaScript 文字 字符串 转换 str Python      更新时间:2023-09-26

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

多谢。

你想要 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。

如何在%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();'

逐步完成代码:

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包含引号、换行符和其他敏感字符,您需要确保不会出现任何问题。我就交给你了。

在字符串内插中使用 repr:

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

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

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

... % repr(jsstring)

不使用repr也可能是一个安全漏洞(通过注入"或"或其他字符)。如果您的字符串包含这些字符,则无法使用repr也可能导致您的 javascript 失败。虽然如果安全性是一个问题,你也会希望避免像</script>这样的文本,以及其他东西,通过一个适当的转义系统,或者用base64之类的东西编码它。

你最好适当地引用字符串,无论你传递给函数什么。这将使事情变得简单

对于提到的示例

>>> 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(); }'''