在 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">
我想从 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">