17

不確定な URL に新しいパラメーターを追加する必要がありますparam=value

実際の URL にすでにこのようなパラメータがある場合

http://url.com?p1=v1&p2=v2

URL を次のように変換する必要があります。

http://url.com?p1=v1&p2=v2&param=value

ただし、URL に次のようなパラメーターがまだない場合:

http://url.com

URL を次のように変換する必要があります。

http://url.com?param=value

の存在を探すだけで&は十分かどうかわからないので、これを正規表現で解決するのは心配です。URL をURIオブジェクトに変換してから、param を追加して再度 String に変換する必要があるのではないかと考えています。

すでにこの状況に陥っている人からの提案を探しています。

アップデート

参加を支援するために、基本的なテスト スイートを共有しています。

require "minitest"
require "minitest/autorun"

def add_param(url, param_name, param_value)
  # the code here
  "not implemented"
end

class AddParamTest < Minitest::Test
  def test_add_param
    assert_equal("http://url.com?param=value", add_param("http://url.com", "param", "value"))
    assert_equal("http://url.com?p1=v1&p2=v2&param=value", add_param("http://url.com?p1=v1&p2=v2", "param", "value"))
    assert_equal("http://url.com?param=value#&tro&lo&lo", add_param("http://url.com#&tro&lo&lo", "param", "value"))
    assert_equal("http://url.com?p1=v1&p2=v2&param=value#&tro&lo&lo", add_param("http://url.com?p1=v1&p2=v2#&tro&lo&lo", "param", "value"))
  end
end
4

4 に答える 4

30
require 'uri'

uri = URI("http://url.com?p1=v1&p2=2")
ar = URI.decode_www_form(uri.query) << ["param","value"]
uri.query = URI.encode_www_form(ar)
p uri #=> #<URI::HTTP:0xa0c44c8 URL:http://url.com?p1=v1&p2=2&param=value>

uri = URI("http://url.com")
uri.query = "param=value" if uri.query.nil?
p uri #=> #<URI::HTTP:0xa0eaee8 URL:http://url.com?param=value>

EDIT:(fguillenによる、すべての優れた命題をマージし、彼の質問テストスイートと互換性を持たせるため。)

require 'uri'

def add_param(url, param_name, param_value)
  uri = URI(url)
  params = URI.decode_www_form(uri.query || "") << [param_name, param_value]
  uri.query = URI.encode_www_form(params)
  uri.to_s
end
于 2013-05-18T11:29:58.523 に答える