Ruby функция похожа на parse_str в php? - PullRequest
1 голос
/ 09 июня 2010

Мне нужно разобрать строку следующим образом: a [metadata] [] [name] = dont | do | this & a [name] = Hello World & a [metadata] [] [value] = i | реально | имею ввиду

CGI :: parse дает мне это:

{"a [name]" => ["Hello World"], "a [metadata] [] [name]" => ["dont| do | this "]," a [метаданные] [] [value] "=> [" i | действительно | это значит "]}

Я бы хотел что-то вроде того, что PHP делает с parse_str, который когдапри условии, что та же самая строка делает это:

Array
(
    [a] => Array
        (
            [metadata] => Array
                (
                    [0] => Array
                        (
                            [name] => dont|do|this
                        )

                    [1] => Array
                        (
                            [value] => i|really|mean it
                        )

                )

            [name] => Hello World
        ))

Любая помощь будет потрясающей.

Спасибо!

1 Ответ

0 голосов
/ 10 июня 2010

На самом деле не получил никаких ответов, и до сих пор не нашел эквивалентной функции, поэтому для моих целей это работает, основываясь на чем-то, что я обнаружил, что _why опубликовал на недостающем redhanded.hobix.com или что нет .

hash1 = {}
hash2 = {}
array1 = []
array2 = []
resulthash = {}
count = 0
count2 = 0
keynum2 = 0
main = 'base'
h3main = 'base'
st.scan(/([\w]+)(\[|=)(.*?)(?=(&[\w]+\[|&[\w]+=|$))/) {
  var = $1 << $2 << $3  
  case var
  when /^([\w]+)\[(.*?)\]\[(\d+)\]\[(.*?)\]=(.*?)$/ then
    count2 += 1
     h3main = $2
     keynum2 = $2 << count2.to_s
     i = $3.to_i
     array1[i] = {} if array1[i].class != Hash
     array1[i].update({$4 => $5})
     hash2.update(keynum2 => array1)
  when /^([\w]+)\[(.*?)\]\[\]\[(.*?)\]=(.*?)$/ then
     count2 += 1
     h3main = $2
     keynum2 = $2 << count2.to_s
     i = count2
     array2[i] = {} if array2[i].class != Hash
     array2[i].update({$4 => $5})
     hash2.update(keynum2 => array2)
  when /^([\w]+)\[(.*?)\]=(.*?)$/ then 
     main = $1
     count += 1
     keynum = $1 << count.to_s
     hash1.update(keynum => {$2 => $3})
  when /^(a)=(.*?)$/ then 
    resulthash.update($1 => $2)
  end
}
hashx = {}
hash1.each_pair {|k,v| hashx.update(main => v) }
resulthash[main] = hashx
if not hash2.empty? then
  if not resulthash[h3main].class == Hash then
    resulthash[main][h3main] = {}
  end
  hash2.each_pair{ |k,v| 
    if v.class == Array then
      resulthash[main][h3main] = v
    else
      resulthash[main][h3main].update(v)
    end
  }
end

Вышеуказанное работает, заметьте, у меня есть реальный способ рассказать, как группировать [] элементы, чтобы они были в массиве как отдельные элементы. Лучше всего установить индекс, например, [somegroup] [0] [value] и т. Д.

Это была копия, вставленная и обобщенная, поэтому будьте осторожны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...