在 ruby 中提取 url 参数

Extract url params in ruby

我想从 url 中提取参数。我有以下路径模式:

pattern = "/foo/:foo_id/bar/:bar_id"

和示例url:

url = "/foo/1/bar/2"

我想得到 {foo_id: 1, bar_id: 2}。我试图将模式转换成这样的东西:

"\/foo\/(?<foo_id>.*)\/bar\/(?<bar_id>.*)"

当我想替换 url 中的反斜杠时,第一步失败了:

formatted = pattern.gsub("/", "\/")

你知道如何修复这个 gsub 吗?也许你知道更好的解决方案。

编辑: 很简单Ruby。我没有使用 RoR。

试试这个:

regex = /\/foo\/(?<foo_id>.*)\/bar\/(?<bar_id>.*)/i
matches = "/foo/1/bar/2".match(regex)
Hash[matches.names.zip(matches[1..-1])]

IRB 输出:

2.3.1 :032 > regex = /\/foo\/(?<foo_id>.*)\/bar\/(?<bar_id>.*)/i
 => /\/foo\/(?<foo_id>.*)\/bar\/(?<bar_id>.*)/i
2.3.1 :033 > matches = "/foo/1/bar/2".match(regex)
 => #<MatchData "/foo/1/bar/2" foo_id:"1" bar_id:"2">
2.3.1 :034 > Hash[matches.names.zip(matches[1..-1])]
 => {"foo_id"=>"1", "bar_id"=>"2"}

我建议阅读这篇关于 Rack 如何解析查询参数的文章。以上适用于您给出的示例,但不能扩展为其他参数。

http://codefol.io/posts/How-Does-Rack-Parse-Query-Params-With-parse-nested-query

这可能对您有所帮助,foo id 和 bar id 是动态的。

require 'json'

#url to scan
    url = "/foo/1/bar/2"
#scanning ids from url
    id = url.scan(/\d/)
#gsub method to replacing values from url
    url_with_id = url.gsub(url, "{foo_id: #{id[0]}, bar_id: #{id[1]}}")

#output    
    => "{foo_id: 1, bar_id: 2}"

如果要将字符串更改为散列

url_hash = eval(url_with_id)

=>{:foo_id=>1, :bar_id=>2}

正如我上面所说,您只需要在 Regexp 文字中转义斜杠,例如/foo\/bar/。从字符串定义正则表达式时,没有必要:Regexp.new("foo/bar") 生成与 /foo\/bar/.

相同的正则表达式

至于你更大的问题,下面是我的解决方法,我猜这几乎是你计划解决它的方法:

PATTERN_PART_MATCH = /:(\w+)/
PATTERN_PART_REPLACE = '(?<>.+?)'

def pattern_to_regexp(pattern)
  expr = Regexp.escape(pattern) # just in case
           .gsub(PATTERN_PART_MATCH, PATTERN_PART_REPLACE)
  Regexp.new(expr)
end

pattern = "/foo/:foo_id/bar/:bar_id"
expr = pattern_to_regexp(pattern)
# => /\/foo\/(?<foo_id>.+?)\/bar\/(?<bar_id>.+?)/

str = "/foo/1/bar/2"
expr.match(str)
# => #<MatchData "/foo/1/bar/2" foo_id:"1" bar_id:"2">