それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

URIモジュールを使わずに、uriからパス以外を取り出す。ruby

uri からパス以外の部分を取り出したい。つまりホスト部分を取り出したい。

http://d.hatena.ne.jp/takuya_1st/2010-11-29/
http://d.hatena.ne.jp/takuya_1st/2010-11-29/p1

から↓

http://d.hatena.ne.jp/takuya_1st/

を取り出したい

一般的なURL::HTTPも扱いたい。

特定パスのより上を取り出したい。

http://user:passwd@localhost:port/path/to/file

↓こうしたい。

http://user:passwd@localhost:port/

のパス部分を除いてホスト部分だけを取り出したい。

String#split が便利です。

URIモジュール使うまでもない。

"http://d.hatena.ne.jp/takuya_1st/".split('/').first(3).join('/')
=>"http://d.hatena.ne.jp

なんて便利なツールなんだ。Rubyは。

上位2階層までなら

"http://d.hatena.ne.jp/takuya_1st/2010-11-29/p1".split('/').first(5).join('/')
=>"http://d.hatena.ne.jp/takuya_1st/2010-11-29"

おおお楽ちん。

URIモジュール不便。。

ちなみにURIモジュールを使うとすごく面倒。。

u=URI.parse("http://d.hatena.ne.jp/takuya_1st/")
URI::HTTP.build([ u.userinfo,u.host,u.port,nil,nil,nil ])
# => #<URI::HTTP:0x480d190 URL:http://d.hatena.ne.jp>
#
#すこし簡単に
u.to_s.split(u.path).first # =>  "http://d.hatena.ne.jp"
#このアプローチは、いろいろ面倒だった。
puts "#{u.scheme}://#{u.userinfo}@#{u.host}:#{u.port}"

URIのパス区切りは"/"と決まっているので、それをString#splitに指定してやる。これはRubyに限らず他の言語でも。

"/" がQueryに入っている可能性もあるが、左から見て行くのなら、全然問題ない。

URIURIオブジェクトを使うようにと教わるんだけど。ちょっと書きたいとき、わざわざ使い方見て、使うの不便だよね。