2012-11-02 12 views
5

Używam DMOZ 's list of url topics, która zawiera niektóre adresy URL, które mają nazwy hostów zawierające podkreślenie.Alternatywa dla URI.parse, która umożliwia nazwom hostów podkreślenie

Na przykład:

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> 

Chociaż url będzie działać w przeglądarce internetowej (lub przynajmniej to ma miejsce w kopalni: p), it's not legal according to the standard:

nazwa hosta nie może zawierać inne znaki, takie jak znak podkreślenia (_),

co powoduje błędy podczas próby analizowania takiego URL z URI.parse:

[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' 

Czy istnieje alternatywa dla URI.parse Mogę użyć, która ma niższą dokładność, nie staczając własnych?

Odpowiedz

10

Wypróbuj Addressable::URI. Jest bardziej zgodny z RFC niż URI i jest bardzo elastyczny.

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

Użyłem go do niektórych projektów i byłem z niego zadowolony. URI robi się trochę ... zardzewiały i potrzebuje TLC. Innego pisali o nim zbyt:

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

Było dość dyskusja o stanie uri za kilka lat temu wśród programistów Ruby. Nie mogę znaleźć linka do niego w tej chwili, ale było zalecenie, aby Adresable :: URI był używany jako zamiennik. Nie wiem, czy ktoś nadszedł, by przejąć rozwój URI, lub gdzie wszystko jest teraz. W moim własnym kodzie nadal używam URI dla prostych rzeczy i przełączam się na Adresowalne :: URI, gdy URI udowodni, że robi coś niewłaściwego dla mnie.