2012-11-06 18 views
7

Nói rằng tôi có một chuỗi như thế này: "http://something.example.com/directory/"Làm thế nào để phân tích cú pháp URL và trích xuất các chuỗi con cần

Những gì tôi muốn làm là để phân tích chuỗi này, và trích xuất các "something" từ chuỗi.

Bước đầu tiên, rõ ràng là kiểm tra để đảm bảo rằng chuỗi chứa "http://" - nếu không, nó sẽ bỏ qua chuỗi.

Nhưng, làm cách nào để tôi chỉ trích xuất các "something" trong chuỗi đó? Giả sử rằng tất cả các chuỗi mà điều này sẽ được đánh giá sẽ có cấu trúc tương tự (tức là tôi đang cố gắng trích xuất tên miền phụ của URL - nếu chuỗi đang được kiểm tra thực sự là URL hợp lệ - khi hợp lệ bắt đầu bằng "http://").

Cảm ơn.

P.S. Tôi biết cách kiểm tra phần đầu tiên, tức là tôi có thể chỉ cần tách chuỗi tại số "http://" nhưng điều đó không giải quyết được vấn đề đầy đủ vì điều đó sẽ tạo ra "http://something.example.com/directory/". Tất cả tôi muốn là "something", không có gì khác.

+0

http://www.regular-expressions.info/ruby.html – durron597

+1

@ durron597: Đừng đánh lừa mọi thứ bằng regexen. URL là một đối tượng được xác định rõ, được xử lý hàng triệu lần trong thư viện chuẩn của Ruby và trong hàng triệu đá quý khác. Nếu tôi là một chuyên gia, tôi sẽ trả lời. –

+0

Có gì với tất cả các downvotes? Đừng hiểu. – marcamillion

Trả lời

18

tôi muốn làm điều đó theo cách này:

require 'uri' 

uri = URI.parse('http://something.example.com/directory/') 
uri.host.split('.').first 
=> "something" 

URI được xây dựng vào Ruby. Nó không phải là đầy đủ tính năng nhất nhưng nó rất nhiều khả năng làm nhiệm vụ này cho hầu hết các URL. Nếu bạn có IRIs thì hãy xem Addressable::URI.

+0

Tôi thích điều này. Đẹp, thanh lịch và không đắt tiền. Cảm ơn! – marcamillion

+1

Và nó không yêu cầu chúng tôi duy trì bất kỳ regex nào. –

+0

Có ... chỉ là những gì tôi đang tìm kiếm. Cảm ơn Meng !!! – marcamillion

2

Vâng, bạn có thể sử dụng cụm từ thông dụng. Giống như /http:\/\/([^\.]+)/, tức là nhóm đầu tiên không phải là '.' chữ cái sau http. Kiểm tra http://rubular.com/, bạn có thể kiểm tra biểu thức thông thường của bạn chống lại một loạt các bài kiểm tra cũng vậy, nó là tuyệt vời cho việc học tập công cụ này :)

+1

Tôi bắt đầu làm điều này, nhưng nó khá là khá lộn xộn. – marcamillion

6

Bạn có thể sử dụng URI như

uri = URI.parse("http://something.example.com/directory/") 
puts uri.host 
# "something.example.com" 

và sau đó bạn có thể chỉ làm việc trên máy chủ.
Hoặc có một viên ngọc domainatrix từ Remove subdomain from string in ruby

require 'rubygems' 
require 'domainatrix' 

url = Domainatrix.parse("http://foo.bar.pauldix.co.uk/asdf.html?q=arg") 
url.public_suffix  # => "co.uk" 
url.domain    # => "pauldix" 
url.subdomain   # => "foo.bar" 
url.path    # => "/asdf.html?q=arg" 
url.canonical   # => "uk.co.pauldix.bar.foo/asdf.html?q=arg" 

và bạn chỉ có thể lấy tên miền phụ.

+0

Tôi nghĩ đây là giải pháp tổng thể tốt cho bất kỳ ai muốn phân tích cú pháp tất cả các loại URL. Tuy nhiên, trong trường hợp của tôi, tôi chỉ cần phân tích một định dạng URL cụ thể - đó là 'foo.bar/somedir'. – marcamillion

+0

@marcamillion Đó là lý do tại sao tôi đưa cho bạn lựa chọn thay thế đầu tiên, giống như những gì mà Tin Man trả lời. – oldergod

+0

@oldergod: Dominatrix được duy trì như thế nào? Nó có trưởng thành không? –

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