2012-05-02 139 views
2

我如何將字符串轉換爲哈希?字符串哈希轉換

現在我用:

eval "{'1627207:28320'=>'text'}" 
=> {'1627207:28320'=>'text'} 

但 「EVAL」 不利於我的情況 - 字符串從PARAMS過去了,這種情況下,它是不安全的

編輯:

通過的字符串也可以是:

"{'1627207'=>'text', '11:167:28320'=>'text 1/text 2/unicode=>привет!'}"

這時需要導致哈希:

{'1627207:28320'=>'text', 
'11:167:28320'=>'text 1/text 2/unicode=>привет!'} 
+1

http://stackoverflow.com/a/9910355/1275603也許類似的東西 –

+0

我想真正的問題是,你爲什麼讓您的用戶將Ruby代碼傳遞給你的應用程序?爲什麼不能像JSON那樣安全地解析一個格式? –

回答

4
str = "{'1627207:28320'=>'text'}" 
p Hash[*str.delete("{}'").split('=>')] #{"1627207:28320"=>"text"} 

不同的輸入編輯:

str = "{'1627207:28320'=>'text', 'key2'=>'text2'}" 
p Hash[*str.delete("{}'").split(/=>|, /)] #{"1627207:28320"=>"text", "key2"=>"text2"} 
+0

這很好,但用戶可以通過「{'1627207:28320'=>'text','key2'=>'text2'}」字符串。然後錯誤:'ArgumentError:哈希的奇數參數爲 \t from(irb):in'[]' – mpz

+0

然後你可以在正則表達式上分割。代碼編輯。 – steenslag

0

相當簡單:

$ irb 
irb(main):001:0> k='1627207:28320' 
=> "1627207:28320" 
irb(main):002:0> v='text' 
=> "text" 
irb(main):003:0> h={k => v} 
=> {"1627207:28320"=>"text"} 
irb(main):004:0> h 
=> {"1627207:28320"=>"text"} 
irb(main):005:0> 
+0

但是你不解析字符串,只是從變量創建一個哈希 –

+0

他做了什麼樣的解析?在他的例子中,他從文本中獲取哈希值。如果他得到一個字符串看起來像一個散列,然後解析是必要的Grzegorz指出 – Miquel

+0

他得到'「{'some_key'=>'價值'}」字符串,但也可以得到'「{'第一'=> 1, 'second'=> 2}「',因爲兩個字符串都包含散列。所以他需要一個可以將所有字符串轉換爲散列的代碼 –

2
class String 
    def to_h 
    h={} 
    self.scan(/'(\w+.\w+)'=>'(\w+)'/).each { |k,v| h[k]=v } 
    h 
    end 
end 

p "{'1627207:28320'=>'text','test'=>'text2'}".to_h 
=>{"1627207:28320"=>"text", "test"=>"text2"} 

編輯:短版

class String 
    def to_h 
    Hash[self.scan(/'([^']+)'=>'([^']+)'/)] 
    end 
end 
+0

曾效力:'「{'key'=>'texttext'}」'但不適用於'「{'key'=>'text text'}」' – mpz

+0

好吧,正則表達式需要面向inpout需要處理,調整較短的版本以查找char'作爲分隔符 – peter

0

你可以簡單地嘗試這個辦法:

text_hash['1627207:28320'] = 'text' 
text_hash 
相關問題