2013-12-04 3 views
0

Я осмотрелся и не могу найти то, что мне нужно для переполнения стека, и задавался вопросом, было ли у кого-то простое решение.Увеличение числового параметра в строке параметра URL?

Я хочу найти параметр в пределах URL и увеличения его стоимости, так, в качестве примера:

?kws=&pstc=&cty=&prvnm=1 

Я хочу, чтобы быть в состоянии найти параметр prvnm независимо от того, где он находится в строке и увеличьте его значение на 1.

Я знаю, что могу разбить параметры на массив, найти ключ, увеличить его и записать его, но это кажется довольно длинным и интересно, есть ли у кого-то какие-то идеи!

+0

long winded? 'Str.split (? &). Отображение {|| ar = s.split (? =); ar [] = если ar []; ar.join()}. join() '? действительно, это очень похоже на то, что после заполнения некоторых маленьких кусочков, конечно, – quetzalcoatl

+0

Воспользуйтесь встроенным классом [URI] (http://www.omniref.com/docs/ruby/stdlib/2.0.0-p247/classes /URI.html), чтобы разделить и перестроить URL-адреса. Он правильно обработает кодировку для вас. Существует также [Addressable :: URI] (http://addressable.rubyforge.org/) gem, который является более полнофункциональным. –

ответ

3
require "uri" 

url = "http://example.com/?kws=&pstc=&cty=&prvnm=1" 

def new_url(url) 
    uri = URI.parse(url) 
    hsh = Hash[URI.decode_www_form(uri.query)] 
    hsh['prvnm'] = hsh['prvnm'].next 
    uri.query = URI.encode_www_form(hsh).to_s 
    uri.to_s 
end 

new_url(url) # => "http://example.com/?kws=&pstc=&cty=&prvnm=2" 
0

Использование:

require 'uri' 

Тогда:

  1. parsed-url= URI.parse(ur full url)
  2. r = CGI.parse(parsed_url.query)

r теперь хэш всех параметров запроса.

Вы можете легко получить доступ к нему с помощью:

r["prsvn"].to_i + 1 
+1

"ур"? Пожалуйста, уделите время правильному написанию «своего». Известно, что люди будут игнорировать то, что вы пишете, если вы не можете потратить время на правильное произношение. Кроме того, узнайте, как сделать форматирование в Stack Overflow и правильно использовать пунктуацию, чтобы ваша работа была легче читать. Люди будут понижать вас за то, что вы игнорировали подобные вещи. –

+0

Благодарим вас за советы. Только что отредактировал мой ответ. :-) –

1
split the string by `&` 
then iterate over the parts 
then split each part by `=` and inspect the results 
    when found `prvnm`, parse the integer and increment it 
    then join the bits by '=' 
then join the parts by '&' 

Или, использование регулярных выражений, как:

/[?&]prvnm=\d+/ 

и анализировать результат, а затем сделать замену.

Или получить URL-разбор библиотеки ..

+0

В вашем регулярном выражении я не верю '[]' или '?' Делать что-нибудь. –

+0

@CarySwoveland: о да, они делают. Они защищают от 'asdasdprvnm' так же, как' = 'защиты от' prvnmasdas' ключей. Конечно, регулярное выражение должно быть соответствующим образом адаптировано, например, добавлять группы захвата или маркировать некоторые части в качестве взгляда или взгляда, но это не точка «идеи». – quetzalcoatl

+0

@CarySwoveland: может быть, вы не заметили, что '? &' Находятся внутри группы символов? Кстати. ваш пример не удастся, если URL-адрес «? prvnm = 2 & kws = & pstc = & cty ='. Вот почему я включил зарядное устройство. Вы тоже должны! – quetzalcoatl

0

Попробуйте что-то вроде этого:

params = "?kws=&pstc=&cty=&prvnm=1" 
num = params.scan(/prvnm=(\d)/)[0].join.to_i 
puts num + 1 
2

Есть уже четыре ответы, так что мне пришлось придумать что-то немного иначе :

s = "?kws=&pstc=&cty=&prvnm=1" 

head, sep, tail = s.partition(/(?<=[?&]prvnm=)\d+/) 
head + (sep.to_i + 1).to_s + tail # => "?kws=&pstc=&cty=&prvnm=2" 
  • 'String#partition' возвращает массив из трех строк [head, sep, tail], such that head + sep + tail => s, где sep arator - аргумент partition, который может быть строкой или regex.
  • Мы хотим, чтобы разделитель составлял цифры &prvnm=. Поэтому мы используем regex с \d+, предшествующим вышеупомянутой строкой, которую мы хотим рассматривать как имеющую нулевую длину, поэтому она не будет включена в разделитель. Это требует «положительного взгляда»: (?<=&prvnm=). \d+ «жадный», поэтому он принимает все последовательные цифры.
  • Для данного значения s, head, sep, tail = s.partition(/(?<=&prvnm=)(\d+)/) => ["?kws=&pstc=&cty=&prvnm=", "1", ""].

Edit: мои благодаря @quetzalcoatl для указания на то, что мне нужно, чтобы изменить (?<=&prvnm=) в моем регулярном выражении к тому, что у меня есть сейчас, как то, что я был бы не в состоянии, когда ?prvnm= был в начале строки.

Смежные вопросы