2012-10-03 14 views
16

मैं किसी जेएसओएन को एक स्क्रिप्ट (मेरा नहीं) के माध्यम से सर्वर पर भेज रहा हूं जो 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" 

लेकिन वाक्य रचना सही पाने के लिए नहीं कर पा रहे।

+3

कैसे हैं मूल्य "पारित"? क्योंकि * वह * दोष की तरह लगता है; जेएसओएन एम्बेडेड कोट्स को ठीक से संभालता है, और एक बार यह * रूबी स्ट्रिंग के अंदर * होता है, इससे कोई फर्क नहीं पड़ता। –

+0

यदि "स्क्रिप्ट के माध्यम से" उप-प्रक्रिया का अर्थ है, तो कृपया बिना किसी सबशेल के * इसे खोलें, जो इस समस्या को पूरी तरह से यूनिक्स-जैसी प्रणालियों में ठीक करेगा। (मुझे यकीन नहीं है कि Win32 सामान इस बकवास के लिए पर्याप्त रूप से पैच किया गया है।) –

+2

'x।उप ("'", "\\\\'") 'वह करता है जो आप करने की कोशिश कर रहे हैं। लेकिन टिन मैन का रास्ता जेसनिफ़ाई करने का सही तरीका है। – Zabba

उत्तर

3

आप 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\"" 
    } 
+0

JSON मणि का उपयोग नहीं कर रहा है क्योंकि इसकी वास्तव में आवश्यकता नहीं है और यह मेरे क्लाइंट कंप्यूटर पर नहीं चल रहा है। –

26

कारण sub("'", "\'") काम नहीं करता है क्योंकि है "\'""'" रूप में ही है । डबल कोट्स के भीतर, एक एकल उद्धरण से बचने वैकल्पिक है।

कारण sub("'", "\\'") काम नहीं करता है क्योंकि "\\'" एक सिंगल कोट के बाद बैकस्लैश तक फैलता है। sub या gsub तर्क के भीतर, कुछ अक्षरों के बाद बैकस्लैश का विशेष अर्थ भिन्न वैश्विक चर के अनुरूप है। विशेष रूप से इस मामले में, वैश्विक चर $' अंतिम मिलान बिंदु के बाद सबस्ट्रिंग रखता है। sub या gsub तर्क स्थिति एक समान चीज़ को संदर्भित करता है। आदेश में इस विशेष सम्मेलन बचने के लिए, आप एक तर्क के बजाय एक ब्लॉक में प्रतिस्थापन स्ट्रिंग रखना चाहिए, और जब से तुम नहीं सिर्फ एक मैच के लिए चाहते हैं, आप का उपयोग करना चाहिए gsubsub के बजाय:

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

हां जो वास्तव में –

+0

@DaveSag काम नहीं करता है यह काम करता है। – sawa

+0

नहीं - यह \ "एक अद्भुत स्ट्रिंग देता है" ' –

1

यह संभावना है कि यदि आप एक उद्धरण (एस्ट्रोफ़े) से बचने की कोशिश कर रहे हैं, तो आप डबल कोट्स से बचना चाहते हैं। (यह जावास्क्रिप्ट/JSON के लिए लागू होता है)

सबसे आसान तरीका है escape_javascripthttp://api.rubyonrails.org/classes/ActionView/Helpers/JavaScriptHelper.html इसका इस्तेमाल करने की है "पलायन कैरिएज रिटर्न और जावास्क्रिप्ट क्षेत्रों के लिए सिंगल और डबल उद्धरण।"

नोट यह केवल रेल के लिए काम करता है, सादे रूबी नहीं। लेकिन अगर आप कुछ इस तरह का उपयोग कर सादे रूबी के लिए एक polyfill बना सकते हैं:

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 
1

इस तरह की कोशिश करो, बैकस्लैश का उपयोग से बचने के लिए:

puts 'sean\'s' 

उत्पादन किया जाना चाहिए:

sean's 
संबंधित मुद्दे