6

私はDMOZのURLトピックのリストを使用しています。これには、アンダースコアを含むホスト名を持ついくつかのURLが含まれています。

例えば:

608  <ExternalPage about="http://outer_heaven4.tripod.com/index2.htm">
609    <d:Title>The Outer Heaven</d:Title>
610    <d:Description>Information and image gallery of McFarlane's action figures for Trigun, Akira, Tenchi Muyo and other Japanese Sci-Fi animations.</d:Description>
611    <topic>Top/Arts/Animation/Anime/Collectibles/Models_and_Figures/Action_Figures</topic>
612  </ExternalPage>

このURLはWebブラウザで機能しますが(または、少なくとも私の場合は:pで機能します)、標準では合法ではありません

ホスト名には、アンダースコア文字(_)などの他の文字を含めることはできません。

URI.parseこのようなURLを:で解析しようとするとエラーが発生します。

[2] pry(main)> require 'uri'
=> true
[3] pry(main)> URI.parse "http://outer_heaven4.tripod.com/index2.htm"
URI::InvalidURIError: the scheme http does not accept registry part: outer_heaven4.tripod.com (or bad hostname?)
from ~/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/uri/generic.rb:213:in `initialize'

URI.parse自分で転がさずに厳しさを抑えて使える代替品はありますか?

4

1 に答える 1

11

Addressable::URIを試してください。これは、URIよりもRFCに厳密に従い、非常に柔軟性があります。

require 'addressable/uri'
uri = Addressable::URI.parse('http://outer_heaven4.tripod.com/index2.htm') 
uri.host 
=> "outer_heaven4.tripod.com"

私はそれをいくつかのプロジェクトに使用し、満足しています。URIは少し...さびており、TLCを必要としています。他の人もそれにコメントしています:

http://www.cloudspace.com/blog/2009/05/26/replacing-rubys-uri-with-addressable/

数年前、Ruby開発者の間でURIの状態についてかなりの議論がありました。現在、リンクが見つかりませんが、代わりにAddressable::URIを使用することをお勧めします。誰かがURI開発を引き継ぐためにステップアップしたかどうか、または現在の状況はわかりません。私自身のコードでは、単純なことには引き続きURIを使用し、URIが間違ったことをしたことが判明した場合は、Addressable::URIに切り替えます。

于 2012-11-02T14:59:25.670 に答える