增加URL参数字符串中的数字参数?

时间:2013-12-04 18:37:12

标签: ruby string

我看了一眼,无法在Stack Overflow上找到我需要的内容,并且想知道是否有人有一个简单的解决方案。

我想在URL中找到一个参数并增加其值,因此,举个例子:

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

我希望能够找到prvnm参数,无论它在字符串中的位置,并将其值增加1。

我知道我可以将参数拆分成一个数组,找到关键字,增加它并将其写回来,但这看起来很长,并且想知道其他人是否有任何想法!

5 个答案:

答案 0 :(得分: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"

答案 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+是“贪婪的”,因此需要所有相关的数字。
  • 对于shead, sep, tail = s.partition(/(?<=&prvnm=)(\d+)/) => ["?kws=&pstc=&cty=&prvnm=", "1", ""]
  • 的给定值

编辑:我要感谢@quetzalcoatl指出我需要将我的正则表达式中的(?<=&prvnm=)更改为我现在拥有的内容,因为?prvnm=在{{1}}开始时我的内容会失败。字符串。

答案 2 :(得分: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解析库..

答案 3 :(得分:0)

使用:

require 'uri'

然后:

  1. parsed-url= URI.parse( ur full url)
  2. r = CGI.parse(parsed_url.query)
  3. r现在是所有查询参数的哈希值。

    您可以使用以下方式轻松访问它:

    r["prsvn"].to_i + 1
    

答案 4 :(得分:0)

尝试这样的事情:

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