27

JSONを文字列として受け入れるスクリプト(私のものではない)を介してサーバーにJSONを渡します。

JSONのコンテンツの一部には一重引用符が含まれているため、スクリプトに渡される前に一重引用符がエスケープされていることを確認したいと思います。

私は以下を試しました:

> irb
> 1.9.3p194 :001 > x = "that's an awesome string"
>  => "that's an awesome string" 
> 1.9.3p194 :002 > x.sub("'", "\'")
>  => "that's an awesome string" 
> 1.9.3p194 :003 > x.sub("'", "\\'")
>  => "thats an awesome strings an awesome string"

しかし、構文を正しく理解できないようです。

4

4 に答える 4

39

sub("'", "\'")動作しない理由"\'"は と同じだからです"'"。二重引用符内では、単一引用符のエスケープはオプションです。

sub("'", "\\'")機能しない理由は"\\'"、バックスラッシュの後に一重引用符が続くように展開されるためです。subor引数内でgsub、いくつかの文字が続くバックスラッシュには、対応するグローバル変数に匹敵する特別な意味があります。特にこの場合、グローバル変数$'は最後の一致点の後の部分文字列を保持します。あなたの"\\'"内部subまたはgsub議論の立場は、同様のものを指しています。この特別な規則を回避するには、置換文字列を引数ではなくブロックに配置する必要があります。1 つだけではなく一致させたいため、代わりに次の文字列を使用する必要がありgsubますsub

gsub("'"){"\\'"}
于 2012-10-03T02:08:55.847 に答える
3

JSON gem を使用しないのはなぜですか?

require 'json'
some_object = {'a string' => "this isn't escaped because JSON handles it.", 'b' => 2}

puts some_object.to_json
=> {"a string":"this isn't escaped because JSON handles it.","b":2}

そして往復の例:

require 'pp'
pp JSON[some_object.to_json]
=> {
    "a string" => "this isn't escaped because JSON handles it.",
        "b" => 2
}

二重引用符を使用した例:

some_object = {
  'a string'       => "this isn't escaped because JSON handles it.",
  'another string' => 'double-quotes get "escaped"'
}
puts some_object.to_json
=> {
            "a string" => "this isn't escaped because JSON handles it.",
      "another string" => "double-quotes get \"escaped\""
  }
于 2012-10-03T00:12:57.910 に答える
2

一重引用符 (アポストロフィ) をエスケープしようとしている場合、二重引用符もエスケープしたい場合があります。(これは Javascript/JSON に適用されます)

最も簡単な方法は、escape_javascript http://api.rubyonrails.org/classes/ActionView/Helpers/JavaScriptHelper.html「JavaScript セグメントのキャリッジ リターンと一重引用符と二重引用符をエスケープする」を使用することです。

注: これはRuby on Railsでのみ機能し、プレーンな Ruby では機能しません。ただし、次のようなものを使用して、プレーン Ruby のポリフィルを作成できます。

JS_ESCAPE_MAP   =   { '\\' => '\\\\', '</' => '<\/', "\r\n" => '\n', "\n" => '\n', "\r" => '\n', '"' => '\\"', "'" => "\\'" }

def escape_javascript(javascript)
  if javascript
    result = javascript.gsub(/(\|<\/|\r\n|\342\200\250|\342\200\251|[\n\r"'])/u) {|match| JS_ESCAPE_MAP[match] }
  else
    ''
  end
end
于 2015-07-07T20:39:44.270 に答える
-2

この方法を試して、バックスラッシュを使用してエスケープします。

puts 'sean\'s'

出力は次のようになります。

sean's
于 2017-01-23T03:43:19.130 に答える