0

Pythonを使用してJavaScriptコードを動的に生成したいと思います。

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

問題はjsstringPython文字列です。

dosomething有効なjavascript関数を作成するために、それを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 に答える