给定任何有效的HTTP / HTTPS字符串,我想解析/转换它,使得最终结果正好是字符串的根。
所以给定的URL:
http://foo.example.com:8080/whatsit/foo.bar?x=y
https://example.net/
我想要结果:
http://foo.example.com:8080/
https://example.net/
我发现URI :: Parser的documentation不是超级平易近人。
我最初的,天真的解决方案是一个简单的正则表达式:
/\A(https?:\/\/[^\/]+\/)/
(即:匹配协议后的第一个斜杠。)
思考&解决方案欢迎如果这是重复的,请道歉,但我的搜索结果不相关。
答案 0 :(得分:26)
使用URI::join:
require 'uri'
url = "http://foo.example.com:8080/whatsit/foo.bar?x=y"
baseurl = URI.join(url, "/").to_s
#=> "http://foo.example.com:8080/"
答案 1 :(得分:11)
使用URI.parse
,然后将path
设置为空字符串,将query
设置为nil
:
require 'uri'
uri = URI.parse('http://foo.example.com:8080/whatsit/foo.bar?x=y')
uri.path = ''
uri.query = nil
cleaned = uri.to_s # http://foo.example.com:8080
现在,您已在cleaned
中获得了已清理的版本。拿出你不想要的东西有时比仅仅抓住你需要的东西更容易。
如果你只做uri.query = ''
,你最终会得到http://foo.example.com:8080?
,这可能不是你想要的。
答案 2 :(得分:2)
您可以使用uri.split()
,然后将这些部分重新组合在一起......
警告:这有点草率。
url = "http://example.com:9001/over-nine-thousand"
parts = uri.split(url)
puts "%s://%s:%s" % [parts[0], parts[2], parts[3]]
=> "http://example.com:9001"