2010-10-02 29 views
13

Tôi đang cố gắng phân tích cú pháp một URI từ đầu vào của người dùng. Tôi giả sử một số người dùng sẽ không đặt lược đồ trong URI của họ và tôi muốn mặc định là "http".Làm cách nào tôi có thể đặt lược đồ cho đối tượng URI trong Ruby

Các mã sau đây không làm việc:

require 'uri' 

uri_to_check = URI::parse("www.google.com") 
uri_to_check.scheme = "http" unless uri_to_check.scheme 

puts uri_to_check.to_s 

tôi mong đợi để xem "http://www.google.com" nhưng tôi nhận được "http: www.google.com". Thậm chí có thể làm theo cách này không?

Nếu có, tôi đang thiếu gì?

Có cách nào tốt hơn để thực hiện việc này không?

Trả lời

14

Các dấu gạch chéo hàng đầu (//) cho biết rằng URL là địa chỉ dựa trên IP và cần thiết để gắn cờ tên máy chủ để URI có thể phân tích cú pháp chính xác.

Wikipedia có một số tổng quan tốt và các ví dụ sử dụng:

http://en.wikipedia.org/wiki/Url, http://en.wikipedia.org/wiki/URI_scheme, http://en.wikipedia.org/wiki/URL_normalization

Các thông tin tốt nhất là trong spec chính nó:. http://www.ietf.org/rfc/rfc1738.txt đặc biệt là ở phần 3.1 "3.1 Common Internet Scheme Cú pháp ".

Bạn có thể muốn xem xét sử dụng đá quý Địa chỉ. Đó là thông minh hơn và là những gì tôi sử dụng khi tôi cần làm nhiều phân tích hoặc thao tác URI.

http://addressable.rubyforge.org/http://addressable.rubyforge.org/api/Addressable/URI.html

+8

+1. Đối với trường hợp sử dụng cụ thể của bạn, bạn có thể muốn xem xét 'Addressable :: URI.heuristic_parse', được * cụ thể * dành cho trường hợp, trong đó một số thông tin bị thiếu thực sự từ URI thay vì cố ý bỏ qua. –

+0

Địa chỉ :: URI.heuristic_parse chính xác là những gì tôi đang tìm kiếm. Cảm ơn bạn! – maz

+0

Đồng ý .. những gì Tin Man nói là đúng, nhưng đối với trường hợp sử dụng thực tế (hoặc ít nhất, những gì câu hỏi cụ thể đề cập đến), 'Addressable :: URI.heuristic_parse' là những gì cần thiết. – hlascelles

4

Khi chuỗi bạn muốn được phân tích không conatin một chương trình, URI không nhận ra nó lầm là một hostname:

irb(main):001:0> require 'uri' 
=> true 
irb(main):002:0> uri = URI::parse("www.google.com") 
=> #<URI::Generic:0x11cfc88 URL:www.google.com> 
irb(main):003:0> uri.path 
=> "www.google.com" 
irb(main):004:0> uri.host 
=> nil 

Khi bạn thiết lập chương trình như bạn làm trong ví dụ của bạn và sau đó gọi to_s URI là xây dựng mà không dẫn chương trình ...

Bạn có thể thử một cái gì đó như sau: (Đó là một cách nhanh chóng hack, tôi không biết các chi tiết URI ...)

uri = URI::parse("www.google.com") 
if uri.scheme.nil? && uri.host.nil? 
    unless uri.path.nil? 
    uri.scheme = "http" 
    uri.host = uri.path 
    uri.path = "" 
    end 
end 

puts uri.to_s 
0.123.
+0

Cảm ơn! Sửa lỗi ví dụ. Một vấn đề sao chép/dán nhỏ;) – maz

+0

Điều này sẽ không hoạt động đối với các URI có đường dẫn. Bạn có thể chỉ cần phân tích lại với sơ đồ. –

Các vấn đề liên quan