2013-05-10 36 views
13

Mã:Nhận tên miền của một url trong C#/NET

string sURL = "http://subdomain.website.com/index.htm"; 
MessageBox.Show(new System.Uri(sURL).Host); 

mang lại cho tôi "subdomain.website.com"

Nhưng tôi cần những tên miền chính "website.com" đối với bất kỳ url hoặc liên kết web.

Tôi làm như thế nào?

+2

Tương tự như http://stackoverflow.com/questions/4643227/top-level-domain-from-url-in-c-sharp – ysrb

+0

Trên thực tế bạn muốn miền cấp cao nhất. subdomain.website.com là tên miền và website.com là tên miền cấp cao nhất. – ysrb

+0

Đây thực sự không phải là một chuỗi rất khó phân tích cú pháp. Bạn đã thử kết hợp đơn giản nào của '.Split' và' string.Join'? –

Trả lời

15

Bạn có thể làm điều này để có được chỉ là hai đoạn cuối cùng của tên máy chủ:

string[] hostParts = new System.Uri(sURL).Host.Split('.'); 
string domain = String.Join(".", hostParts.Skip(Math.Max(0, hostParts.Length - 2)).Take(2)); 

Hoặc này:

var host = new System.Uri(sURL).Host; 
var domain = host.Substring(host.LastIndexOf('.', host.LastIndexOf('.') - 1) + 1); 

Phương pháp này sẽ tìm thấy bao gồm ít nhất hai tên miền các bộ phận, nhưng cũng sẽ bao gồm các phần trung gian của hai ký tự trở xuống:

var host = new System.Uri(sURL).Host; 
int index = host.LastIndexOf('.'), last = 3; 
while (index > 0 && index >= last - 3) 
{ 
    last = index; 
    index = host.LastIndexOf('.', last - 1); 
} 
var domain = host.Substring(index + 1); 

Thao tác này sẽ xử lý các miền như localhost, example.comexample.co.uk. Nó không phải là phương pháp tốt nhất, nhưng ít nhất nó giúp bạn tiết kiệm từ việc xây dựng một danh sách khổng lồ các tên miền cấp cao nhất.

+0

Tôi nghĩ giải pháp thứ hai không hoạt động chính xác. ** Và tôi nghĩ chúng ta cũng nên xem xét một số url như www.google.co.uk mà tên miền gốc chứa nhiều hơn một '.' ** – 2power10

+2

@imJustice Cảm ơn, tôi đã khắc phục giải pháp thứ hai. Tôi cũng đã thêm một giải pháp khá thô để xử lý TLD đa phần. –

+0

Phương thức thứ ba là ném một 'Chỉ mục ra khỏi phạm vi 'ngoại lệ nếu phần cuối cùng của tên miền như (' t' trong 't.co' và' goo' trong 'goo.gl') ngắn hơn 3 ký tự. Vui lòng sửa lỗi này, tôi đang sử dụng mã này làm phương thức Extension. – shashwat

3

Thử cụm từ thông dụng?

using System.Text.RegularExpressions; 

string sURL = "http://subdomain.website.com/index.htm"; 
string sPattern = @"\w+.com"; 

// Instantiate the regular expression object. 
Regex r = new Regex(sPattern, RegexOptions.IgnoreCase); 

// Match the regular expression pattern against a text string. 
Match m = r.Match(sUrl); 
if (m.Success) 
{ 
    MessageBox.Show(m.Value); 
} 
+4

Tốt nhất để xử lý các cụm từ thông dụng dưới dạng ngôn ngữ nước ngoài (cho người đọc) và giải thích lý do tại sao mẫu của bạn giải quyết được vấn đề. –

+2

Nếu nó là .org? – as9876

4

Bạn có thể thử điều này. Điều này có thể xử lý nhiều loại tên miền gốc nếu bạn xác định nó trong một mảng.

string sURL = "http://subdomain.website.com/index.htm"; 
var host = new System.Uri(sURL).Host.ToLower(); 

string[] col = { ".com", ".cn", ".co.uk"/*all needed domain in lower case*/ }; 
foreach (string name in col) 
{ 
    if (host.EndsWith(name)) 
    { 
     int idx = host.IndexOf(name); 
     int sec = host.Substring(0, idx - 1).LastIndexOf('.'); 
     var rootDomain = host.Substring(sec + 1); 
    } 
} 
+0

@ p.s.w.g Bạn đúng, thay đổi để sử dụng EndsWith thay thế. – 2power10

+0

+1 đây cũng là một giải pháp tốt. –