2011-11-23 37 views
8

Tôi có regex sau để kiểm tra xem nếu URL là hợp lệ:Thay đổi regex để cho phép địa chỉ IP khi kiểm tra URL?

preg_match('/^(http(s?):\/\/)?(www\.)?+[a-zA-Z0-9\.\-\_]+(\.[a-zA-Z]{2,3})+(\/[a-zA-Z0-9\_\-\s\.\/\?\%\#\&\=]*)?$/i', $url); 

Tôi muốn thay đổi phần này [a-zA-Z0-9\.\-\_]+(\.[a-zA-Z]{2,3}) (ít nhất tôi hy vọng nó là một phần đậm này) để thể là một địa chỉ IP hoặc này phần nổi bật.

Hiện tại, regex khá tốt đối với tôi vì nó tìm thấy URL không chính xác - mặc dù tôi tin rằng điều này sẽ bắt đầu không hoạt động chính xác khi chính sách miền mới từ ICANN hoạt động (tức là Google có thể muốn url http://search.google - thay vì http://google.com cho tìm kiếm)

nhưng dù sao, tôi muốn thêm khả năng cho phép địa chỉ IP để cũng là URL hợp lệ, nhưng tôi không chắc chắn làm thế nào để yếu tố đó vào regex

Nếu có ai có thể giúp một tay, thì điều đó thật tuyệt vời!

+3

Bạn có thể muốn sử dụng: ['filter_var ('http://example.com', FILTER_VALIDATE_URL)'] (http://php.net/manual/en/function.filter-var.php) – NullUserException

+0

I đã không nhận thức được rằng PHP đã xây dựng trong bộ lọc URL - cảm ơn vì đã chỉ ra điều đó ... – MrJ

Trả lời

8

regex này dường như làm việc:

^(http(s?):\/\/)?(((www\.)?+[a-zA-Z0-9\.\-\_]+(\.[a-zA-Z]{2,3})+)|(\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))(\/[a-zA-Z0-9\_\-\s\.\/\?\%\#\&\=]*)?$ 

Ở phần sau khi kiểm tra cho "http", nó chỉ đơn giản là thực hiện một hoạt động OR, để phù hợp hoặc là một tên miền, hoặc IP. Dưới đây là trích đoạn liên quan:

((www\.)?+[a-zA-Z0-9\.\-\_]+(\.[a-zA-Z]{2,3})+)|(\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) 

Biểu thức IP là hơi dài, nhưng nó làm cho chắc chắn rằng nó là một địa chỉ IP hợp lệ (như trong, không 999.999.999.999). Bạn có thể dễ dàng thay thế nó để kiểm tra IP khác.

Ở đây nó được tích hợp vào mã trước của bạn:

preg_match('/^(http(s?):\/\/)?(((www\.)?+[a-zA-Z0-9\.\-\_]+(\.[a-zA-Z]{2,3})+)|(\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))(\/[a-zA-Z0-9\_\-\s\.\/\?\%\#\&\=]*)?$/i', $url); 
+0

Đẹp nhất - cảm ơn lời giải thích quá :) – MrJ

2

Hai điểm. Lên trên level domains bây giờ dường như tối đa hiện tại 6 ký tự (bảo tàng) vì vậy chúng tôi cần phải giải thích cho rằng:

^(http(s?):\/\/)?(((www\.)?+[a-zA-Z0-9\.\-\_]+(\.[a-zA-Z]{2,6})+)|(\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))(\/[a-zA-Z0-9\_\-\s\.\/\?\%\#\&\=]*)?$ 

Trong C ngôn ngữ dựa chúng ta cần phải thoát khỏi những \

char *regex = "/^(http(s?):\\/\\/)?(www\\.)?+[a-zA-Z0-9\\.\\-\\_]+(\\.[a-zA-Z]{2,6})+(\\/[a-zA-Z0-9\\_\\-\\s\\.\\/\\?\\%\\#\\&\\=]*)?$/i"; 

Trong C Mục tiêu chúng ta có thể định nghĩa một thể loại Phương pháp về NSString:

- (BOOL)isURL 
{ 
    // uses ICU regex syntax http://userguide.icu-project.org/strings/regexp 
    NSString *regex = @"^(http(s?)://)?(www\\.)?+[a-zA-Z0-9\\.\\-_]+(\\.[a-zA-Z]{2,6})+(/[a-zA-Z0-9_\\-\\s\\./\\?%#\\&=]*)?$"; 

    NSPredicate *regextest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex]; 
    return [regextest evaluateWithObject:self]; 
} 

Lưu ý rằng giải pháp này hoàn toàn bỏ qua IPv6!

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