Как избежать одиночной цитаты в Ruby? - программирование
Подтвердить что ты не робот

Как избежать одиночной цитаты в Ruby?

Я передаю JSON на сервер через script (не мой), который принимает JSON как строку.

Некоторое содержимое JSON содержит одинарные кавычки, поэтому я хочу, чтобы все одиночные кавычки были экранированы перед передачей в script.

Я пробовал следующее:

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

но не может показаться, что синтаксис правильный.

4b9b3361

Ответ 1

Причина sub("'", "\'") не работает, потому что "\'" совпадает с "'". В двойных кавычках исключение одной кавычки необязательно.

Причина sub("'", "\\'") не работает, потому что "\\'" расширяется до обратного слэша, за которым следует одиночная кавычка. Внутри аргумента sub или gsub обратная косая черта, сопровождаемая некоторыми символами, имеет особое значение, сопоставимое с соответствующей глобальной переменной. В частности, в этом случае глобальная переменная $' содержит подстроку после последней точки совпадения. Ваша позиция "\\'" в позиции sub или gsub относится к аналогичной вещи. Чтобы избежать этого специального соглашения, вы должны поместить заменяющую строку в блок вместо аргумента, и поскольку вы хотите совместить не только одно, вы должны использовать gsub вместо sub:

gsub("'"){"\\'"}

Ответ 2

Почему вы не используете драгоценный камень JSON?

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\""
  }

Ответ 3

Вероятно, если вы пытаетесь избежать одиночной цитаты (апострофа), вы также хотите избежать двойных кавычек. (Это применимо для Javascript/JSON)

Самый простой способ - использовать escape_javascript http://api.rubyonrails.org/classes/ActionView/Helpers/JavaScriptHelper.html it "Сбрасывает возврат каретки и одиночные и двойные кавычки для сегментов JavaScript."

ПРИМЕЧАНИЕ. Это работает только для Ruby on Rails, а не для простого Ruby. Однако вы можете сделать polyfill для простого 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

Ответ 4

Попробуйте использовать обратную косую черту, чтобы избежать:

puts 'sean\'s'

вывод должен быть:

sean's