2012-02-13 35 views
7

Giúp tôi viết mã như "nếu chuỗi của tôi là URL hợp lệ để làm" Có thể viết mã này bằng một vài chuỗi mã không?Làm cách nào để kiểm tra nhanh xem đối tượng NSString có phải là url hợp lệ không?

+1

Bằng cách "hợp lệ" Cậu chỉ đơn giản có nghĩa là đáp ứng yêu cầu cú pháp, hoặc làm bạn có nghĩa là trỏ đến một trang web hiện tại? –

+0

Tôi chỉ cần cú pháp đúng .. – Stas

Trả lời

19

Tôi sẽ giả định rằng theo URL, bạn đang tham chiếu đến một chuỗi xác định vị trí tài nguyên internet.

Nếu bạn có ý tưởng về định dạng của chuỗi đầu vào, thì tại sao không kiểm tra xem chuỗi có bắt đầu bằng http://, https:// hoặc bất kỳ chương trình nào khác bạn cần không. Nếu bạn mong đợi các giao thức khác, bạn cũng có thể thêm chúng vào danh sách kiểm tra (ví dụ ftp://, mailto://, vv)



if ([myString hasPrefix:@"http://"] || [myString hasPrefix:@"https://"]) 
{ 
    // do something 
} 

Nếu bạn đang tìm kiếm một giải pháp vững chắc hơn và phát hiện bất kỳ loại thức truy cập URL, sau đó bạn nên sử dụng cụm từ thông dụng.

Là một lưu ý phụ, lớp NSURL được thiết kế để thể hiện bất kỳ loại vị trí tài nguyên nào (không chỉ tài nguyên internet). Đó là lý do tại sao, các chuỗi như img/demo.jpg hoặc file://bla/bla/bla/demo.jpg có thể được chuyển đổi thành các đối tượng NSURL.

Tuy nhiên, theo tài liệu, [NSURL URLWithString] phải trả về 0 nếu chuỗi đầu vào không phải là chuỗi tài nguyên internet hợp lệ. Trong thực tế nó không.

+0

Câu trả lời hay! Cảm ơn. Và điều quan trọng nhất là nó hoạt động tốt cho tôi. – Stas

1

Cố gắng tạo NSUrl với nó và xem nó có trả về kết quả không phải không.

+0

Tôi đã thử rằng: nếu ([NSURL urlWithString: urlString]! = Nil) { } nhưng vì một số lý do nó chỉ trả về chuỗi của tôi !! (Mặc dù mô tả phương pháp nói rằng nó phải trả về nil nếu chuỗi không phải là url hợp lệ..không thực sự biết tại sao) – Stas

0
if ([NSURL URLWithString:text]) { 
    // valid URL 
} 
else { 
    // invalid URL 
} 
+0

đó là điểm nó không hoạt động ... tôi đã gặp lỗi lạ hay gì không ?? ? Tôi có đăng nhập nếu NSLog (@ "url không hợp lệ:% @", [NSURL URLWithString: urlString]); Và nó cho tôi thấy: url không hợp lệ: img/playgrounds.png – Stas

+3

Đây là lý do tại sao bạn nên nói những gì bạn đã thử trong câu hỏi của mình. Nếu chuỗi của bạn theo nghĩa đen là "img/playgrounds.png" thì nó đúng; đó không phải là URL hợp lệ. Nếu bạn thử nó, ví dụ: 'http: // img.ly/playground.png' thì nó sẽ hoạt động. –

6
+ (BOOL)validateUrlString:(NSString*)urlString 
{ 
    if (!urlString) 
    { 
     return NO; 
    } 

    NSDataDetector *linkDetector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink error:nil]; 

    NSRange urlStringRange = NSMakeRange(0, [urlString length]); 
    NSMatchingOptions matchingOptions = 0; 

    if (1 != [linkDetector numberOfMatchesInString:urlString options:matchingOptions range:urlStringRange]) 
    { 
     return NO; 
    } 

    NSTextCheckingResult *checkingResult = [linkDetector firstMatchInString:urlString options:matchingOptions range:urlStringRange]; 

    return checkingResult.resultType == NSTextCheckingTypeLink 
     && NSEqualRanges(checkingResult.range, urlStringRange); 
} 
+0

hoạt động. cảm ơn – kevinl

7

tôi đã sử dụng giải pháp này là dường như một tấm séc tốt hơn và ít phức tạp hơn so với một tấm séc Regex -

- (BOOL)isURL:(NSString *)inputString 
{ 
    NSURL *candidateURL = [NSURL URLWithString:inputString]; 
    return candidateURL && candidateURL.scheme && candidateURL.host; 
} 
Các vấn đề liên quan