2011-09-08 6 views
0

私はRuby on Rails 3.0.10を使用しており、サブドメイン部分を含めずにURLのscheme://domain部分を取得したいと考えています。つまり、私は、次のURLサブドメインを含まないURLの `scheme:// domain`部分を取り出す方法は?

http://www.sub_domain.domain.com 

は(私は正規表現を使用する必要がありますか?)ことを、私は私が行うことができますどのように

http://www.domain.com 

を取得したいと思いますを持っている場合は?


UPDATE

@mu is too shortは当然(私は考えさせられました...)彼の\彼女のコメントで述べている:あなたは誤解し

。 www.ac.ukは意味がなく、 のベースドメインはox.ac.ukです。 ac.ukの部分は "academic UK"を意味し、意味的には です。他のいくつかの国では、同様の名称の スキームがあります。

ので、更新質問です:

私は最後まで徐々にサブドメイン部分を削除するには、次の手順に作ったとして(たとえばhttp://www.maths.ox.ac.uk/用)URLを反復することができますどのように?

http://www.maths.ox.ac.uk/ # Step 0 (start) 
http://www.ox.ac.uk/  # Step 1 
http://www.ac.uk/   # Step 2 (end) 
+0

あなたは 'http:// www.maths.ox.ac.uk /'のようなもので何をしますか? –

+0

@muが短すぎます - おそらく、 'http:// www.ac.uk /'の部分を取得するためにプロセスを反復するか、またはそれを直接(反復なしで)取得する方法があるかもしれません。 – Backo

+0

あなたは誤解しています。 'www.ac.uk'は意味がなく、Oxfordのベースドメインは' ox.ac.uk'です。 「ac.uk」部分は「学術英国」を意味し、意味的には1つの要素です。他のいくつかの国でも同様の命名規則があります。 –

答えて

0

これは総ハックです、と私はそれが一般的な意味で有用である可能性がどのようには考えているが、ここであなたが行きます。

ruby-1.8.7-p352 > uri = URI.parse("http://www.foo.domain.com/") 
=> #<URI::HTTP:0x105011840 URL:http://www.foo.domain.com/> 
ruby-1.8.7-p352 > uri.scheme + "://" + uri.host.split(/\./)[-2..-1].join(".") 
=> "http://domain.com" 
+0

私は 'http://domain.com'ではなく' http:// www.domain.com'を取得するべきです。 – Backo

+1

これは '.uk'ドメインといくつかのドメインでは失敗します。 –

+0

うん。私が言ったように、それはひどいので、避けるべきです。答えのポイントは、ホストを取得して分割することです。しかし、あなたが望むように作品を再構成してください。 – jdl

0

あなたはURLが.comで終了し、あなたが指定した書式に従っを知っ場合は、このような正規表現を試みることができる:

\.[\w\-]+\.com 

ドメインを解析すると.comを次のように。プレフィックスはhttp://wwwであり、すべて設定する必要があります。

これには「一般的なケース」の解決法はありません。 URLによっては、1つのドット(.comまたは.edu)の接尾辞を使用するものもあれば、複数のドット(.co.jpなど)を使用するものもあります。あなたはこれを正規表現ほどシンプルなもので解くことはできません。

可能なことは、可能なURLサフィックスのリストを作成し、それぞれの正規表現を構築することです。それはあなたの入力文字列と一致した場合、上記のバリエーションを使用します。

base_regex = '\.[\w\-]+' 
list_of_suffixes.each {|s| 
    thisregex = Regexp.new(base_regex + s) 
    match = thisregex.match(url) 
    next if match == nil 
    return 'http://www.' + match[0] 
} 

注:コードは、私の頭の上からと説明のみを目的としており(それはおそらくそのまま正確に実行されますが、あなたはありません

# Parse and remove all the stuff you don't want. 
u = URI.parse('http://www.sub-domain.domain.com/pancakes') 
u.userinfo = nil 
u.path  = '' 
u.fragment = nil 
# You might want to check u.scheme as well 

host = u.host 

そして今、あなたはhostで何をしたいのかを把握する必要があります。これに対処するための正しい方法はURIを使用することです

+0

URLが '.com'で終わっていることを知りません。 – Backo

+0

質問を更新しました。 – Backo

+0

@Backo - 入力の範囲を '.com'に限定しない場合、問題はより複雑になります。詳細は私の編集を参照してください。 – bta

0

)のポイントを取得します。

あなたは、ドメイン名が有用なものに解決することを確認するために持っているか、あなたが知ることができません:あなたはNet::DNSを使用して何かに解決ドメイン名を取得するまで、最後のコンポーネントから始まり、後方、あなたのように仕事ができます有効なものがあれば代わりに、世界中のさまざまな命名規則をすべて追跡することができますが、ポイントはありません。

これは、あなたが有用なURLを持っていることを保証するものではありませんが、最終的な名前がHTTP要求に応答するかどうかを確認する必要があります。


あなたの元の質問に答えるために:

私は正規表現を使用する必要がありますか?

絶対にありません。 URLは、ほとんどの人が考えるよりもはるかに複雑であるため、URIのような実際のURLパーサーを使用する必要があります。さらに、ドメイン名は、ほとんどの人が思うよりも複雑であるため、賢明なものを得るためにDNSルックアップに頼らざるを得ません。

+0

[Addressable :: URI](https://github.com/sporkmonger/addressable/)を見ることをお勧めします。これは、Rubyの組み込みのものよりも優れたURIライブラリであり、特にこの用途のために、そのテンプレート能力は非常に有用かもしれません。それを得るために 'gem install addressable'を使ってください。 –

+0

@Tin Man:しかし、「ac.uk」、「co.jp」などは単一の単位であることを理解していますか?本当の問題は、URL内のドメインが、単純な「ドットで区切られたコンポーネントのリスト」を超えた内部構造を持っているため、最後の2つのコンポーネントを引き離して意味のあるものにすることができないということです。 –

関連する問題