如何在userinfo部分中使用正斜杠解析URL

时间:2016-09-28 14:13:18

标签: ruby uri userinfo

我有这种格式的网址:

https://clientjiberish:clientsecretjiberish@api.example.com/users?username=tralala

当我这样做时:

url = 'https://clientjiberish:clientsecretjiberish@api.example.com/users?username=tralala'
uri = URI(url)

我得到了我所需要的一切。

uri.host => "api.example.com"
uri.userinfo => "clientjiberish:clientsecretjiberish"
uri.path => '/users'
uri.scheme => 'https'

当userinfo部分中包含正斜杠时,问题就会出现。我无权更改提供API密钥的API,因此我需要找出一种方法来提取URI的上述部分。

以下是您可以测试URI的示例:

url = 'https://clientjiberish:client/secretjiberish@api.example.com/users?username=tralala'
uri = URI(url)

错误:

  

URI :: InvalidURIError:错误的URI(不是URI?)

我发现你可以像这样创建自己的解析器:

parser = URI::Parser.new(:RESERVED => ";/?:@&=+$,\\[\\]")
uri = parser.parse(url)

但我对正则表达式的了解不足以使其发挥作用。

1 个答案:

答案 0 :(得分:0)

url = 'https://clientjiberish:client/secretjiberish@api.example.com/users?username=tralala'
USER_INFO_REGEX = /\Ahttp[s]+:\/\/(.*)@.*\z/i
user_info = USER_INFO_REGEX.match(url)[1]
parsed_user_info = user_info.gsub(/\//, '%2F')
url = url.gsub(Regexp.new(user_info), parsed_user_info)
uri = URI(url)

USER_INFO_REGEX匹配https://@api.example.com...之间的字符串。只需转义用户信息字符串并将其替换为网址。