2010-07-24 49 views
6

Tôi đang cố gắng xây dựng một regex để trích xuất một tên miền được cung cấp một url.Tôi có thể sử dụng regex nào để lấy tên miền từ một url trong Ruby?

cho:

http://www.abc.google.com/ 
http://abc.google.com/ 
https://www.abc.google.com/ 
http://abc.google.com/ 

nên cung cấp:

abc.google.com 
+0

Về mặt DNS, 'www.example.com' không nhất thiết phải trỏ đến cùng một máy như' example.com'. –

+0

www.example.com và example.com có ​​thể có hai trang web khác nhau? – anusuya

+0

Chắc chắn họ có thể. Đó là một quy ước không làm điều đó, nhưng không có gì ngăn cản bạn thiết lập một bản ghi A riêng biệt trên hai tên miền đó trong DNS. –

Trả lời

25
URI.parse('http://www.abc.google.com/').host 
#=> "www.abc.google.com" 

Không phải là một regex, nhưng có lẽ mạnh mẽ hơn sau đó bất cứ điều gì chúng tôi đưa ra ở đây.

URI.parse('http://www.abc.google.com/').host.gsub(/^www\./, '') 

Nếu bạn muốn loại bỏ các www. cũng này sẽ làm việc mà không tăng bất kỳ lỗi nào nếu www. là không có.

+0

tôi muốn xóa www. quá – anusuya

+0

Đây không phải là giải pháp mạnh mẽ nhất. Regex có thể đáng tin cậy hơn, đặc biệt nếu mọi người quên bao gồm "http" trong URI. – Subimage

+0

Nó khá mạnh mẽ nếu bạn có thể giả định tính toàn vẹn dữ liệu, tất nhiên. –

1

Không biết nhiều về ruby ​​nhưng mẫu regex này cung cấp cho bạn 3 phần cuối cùng của url trừ dấu gạch chéo với một minumum 2 ký tự mỗi phần.

([\w-]{2,}\.[\w-]{2,}\.[\w-]{2,})/$ 
+0

Phải là '([\ w -] {2,} \. [\ W -] {2,} \. [\ W -] {2,}) \/$'. 1 mặc dù. – Sarfraz

+0

Còn về (? <= //) [^ /] + –

-1

Câu hỏi của bạn hơi mơ hồ. Bạn có thể đưa ra một đặc tả chính xác về những gì nó là chính xác mà bạn muốn làm không? (Ưu tiên với một testuite.) Ngay bây giờ, tất cả các câu hỏi của bạn nói là bạn muốn có một phương thức luôn trả về 'abc.google.com'. Điều đó thật dễ dàng:

def extract_domain 
    return 'abc.google.com' 
end 

Nhưng đó có thể không phải ý bạn là gì & hellip;

Ngoài ra, bạn nói rằng bạn cần số Regexp. Tại sao? Ví dụ: sử dụng lớp học URI là gì? Sau khi tất cả, phân tích cú pháp và điều chỉnh URI là chính xác là những gì nó được tạo ra!

require 'uri' 

URI.parse('https://abc.google.com/').host # => 'abc.google.com' 

Và cuối cùng, bạn nói bạn là "cố gắng để trích xuất một miền", nhưng bạn không bao giờ xác định những gì bạn nghĩa bởi "miền". Dường như bạn đôi khi có nghĩa là FQDN và đôi khi ngẫu nhiên thả các phần của FQDN, nhưng theo những gì quy tắc? Ví dụ: đối với FQDN abc.google.com, tên miền là google.com và tên máy chủ là abc, nhưng bạn muốn nó trả lại abc.google.com không chỉ là tên miền mà là đầy đủ FQDN. Tại sao?

+0

tôi có thể đã đóng khung qn sai. những gì đang cố gắng làm chỉ là xóa "http: // www" hàng đầu. " và điều chưa từng có sau .com vì vậy, hãy cho "http://www.google.com/" nên cung cấp cho google.com "http://www.abc.google.com/" phải trả lại abc.google.com – anusuya

+0

Tại sao bạn muốn nhận abc.google.com cho http://abc.google.com/ nhưng google.com cho http://www.google.com/? Điều gì làm cho 'www' trở nên đặc biệt? Nó chỉ là một quy ước mà các máy chủ http thường có trên máy chủ có tên www nhưng nó không phải theo cách đó. –

+0

vâng. tôi sử dụng một webservice mà dải http và www một phần của tên. để so sánh kết quả tôi cần làm tương tự trước khi thực hiện – anusuya

0

bạn có thể sử dụng domain_name gem cho loại công việc này. Từ README:

require "domain_name" 
host = DomainName("a.b.example.co.uk") 
host.domain   #=> "example.co.uk" 
Các vấn đề liên quan