2008-09-03 40 views
7

Làm cách nào để xác định xem chuỗi có phải là địa chỉ IP không? Hoặc là IPv4 hoặc IPv6?Cách đánh giá IP?

Số ký tự ít nhất và nhiều nhất là gì?

Tôi cho rằng đây sẽ là câu trả lời regex.

Trả lời

3

Nhưng câu hỏi không đơn giản như giả định a.b.c.d ... there are way more forms than you realised.

Nhưng chắc chắn đây là câu hỏi của Google? Khá nhiều mỗi primer primex mà bạn có thể tìm thấy ở bất cứ đâu sử dụng IP làm ví dụ! ipv4 + regex đạt 183.000 lượt truy cập!

+0

Nhưng vì liên kết bạn cung cấp là một bài viết hay, tôi đã chọn câu trả lời này là câu trả lời đúng. ;) – pek

4

Đối với IPv4, bạn có thể sử dụng cụm từ thông dụng này.

\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b 

Có vẻ khá phức tạp nhưng nó hoạt động bằng cách giới hạn từng quad đến số 0-255.

0

Vì một nửa số regex đó xử lý thực tế là phân đoạn cuối cùng không có dấu chấm ở cuối, bạn có thể cắt giảm một nửa nếu bạn tack '.' đến cuối địa chỉ IP có thể của bạn.

Something như thế này:

bool IsValidIPAddress(string possibleIP){ 
    CrazyRegex = \b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){4}\b 
    return Regex.Match(possibleIP+'.', CrazyRegex) 
} 
0

@unsliced: đúng, vấn đề này có thể nhận được một chút điên.

Nếu bạn thực sự cần xử lý bất kỳ địa chỉ IP nào có thể thì bạn sẽ phải tập hợp một thứ gì đó tinh vi hơn. Tuy nhiên, nếu bạn chỉ muốn thực hiện xác nhận cơ bản để đảm bảo người dùng đang nhập dữ liệu được định dạng đúng, tôi nghĩ là công bằng khi hạn chế họ với mô hình a.b.c.d với các biểu thức chính quy ở trên.

0

@unsliced ​​đó là chính xác tuy nhiên nó sẽ tất nhiên phụ thuộc vào thực hiện, nếu bạn đang phân tích một IP từ một người dùng truy cập trang web của bạn thì bạn có thể sử dụng regex vì nó phải ở định dạng x.x.x.x.

Đối với IPv6 bạn có thể sử dụng này

[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4} 

tuy nhiên nó không bắt tất cả mọi thứ bởi vì với IPv6 nó là phức tạp hơn nhiều, theo công wikipedia tất cả các ví dụ sau đây là technicaly đúng tuy nhiên regex trên sẽ chỉ bắt những người có *

2001:0db8:0000:0000:0000:0000:1428:57ab* 
2001:0db8:0000:0000:0000::1428:57ab* 
2001:0db8:0:0:0:0:1428:57ab* 
2001:0db8:0:0::1428:57ab 
2001:0db8::1428:57ab 
2001:db8::1428:57ab 
6

Trong .NET có loại IPAddress có phương pháp tiện dụng TryParse.

Ví dụ:

if(System.Net.IPAddress.TryParse(PossibleIPAddress, validatedIPAddress)){ 
    //validatedIPAddress is good 
} 

// or more simply: 
bool IsValidIPAddress(string possibleIP){ 
    return System.Net.IPAddress.TryParse(PossibleIPAddress, null) 
} 
5

Tôi đã làm điều này trước đây, nhưng tôi thích bài Raymond Chen tại địa chỉ:

http://blogs.msdn.com/oldnewthing/archive/2006/05/22/603788.aspx

đâu ông về cơ bản ủng hộ sử dụng regexes cho những gì họ đang tốt tại : phân tích cú pháp các thẻ. Sau đó, đánh giá kết quả.Ví dụ của anh ấy:

function isDottedIPv4(s) 
{ 
var match = s.match(/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/); 
return match != null && 
     match[1] <= 255 && match[2] <= 255 && 
     match[3] <= 255 && match[4] <= 255; 
} 

Sẽ dễ dàng hơn nhiều khi xem và bỏ qua những việc cần làm.

+0

Tôi đã thử nghiệm trên nhiều đầu vào khác nhau. Có vẻ như chống đạn. –

-1

IPv4 trở thành: /\d\d?\d?.\d\d?\d?.\d\d?\d?.\d\d?\d?/

Tôi không chắc chắn về các quy tắc IPv6.