2012-02-13 93 views
7

幫我寫一些代碼,如「如果我的字符串是一個有效的網址,請不要輸入」 是否可以在幾串代碼中編寫代碼?如何快速檢查NSString對象是否是有效的url?

+1

通過「有效」你僅僅意味着符合語法要求,還是你的意思是指向一個現有網站? – 2012-02-13 12:49:03

+0

我只需要正確的語法.. – Stas 2012-02-13 13:09:10

回答

19

我會假設通過URL指的是一個標識Internet資源位置的字符串。

如果您對輸入字符串的格式有所瞭解,那麼爲什麼不手動檢查字符串是否以http://https://或您需要的任何其他方案開頭。如果你希望其他協議,也可以將它們添加到檢查列表(例如ftp://mailto://等)



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

如果你正在尋找一個更堅實的解決方案,並檢測到任何類型的URL方案,那麼你應該使用正則表達式。

作爲一個側面說明,NSURL類旨在表達任何類型的資源位置(不只是互聯網資源)。這就是爲什麼像img/demo.jpgfile://bla/bla/bla/demo.jpg這樣的字符串可以轉換成NSURL對象。

但是,根據文檔[NSURL URLWithString]應返回nil,如果輸入字符串不是有效的Internet資源字符串。在實踐中它不是。

+0

很好的答案!謝謝。最重要的是它對我來說工作得很好。 – Stas 2012-02-13 18:37:18

1

嘗試使用它創建NSUrl,並查看它是否返回非零結果。

+0

我已經試過: if([NSURL urlWithString:urlString]!= nil){ } } 但由於某種原因,它只是返回給我我的字符串! (雖然方法描述說,如果字符串不是一個有效的網址,它必須返回nil ..不知道爲什麼) – Stas 2012-02-13 13:08:23

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

這就是它不起作用的地方...我遇到了一個奇怪的錯誤或什麼? ? 我有一個日誌在if NSLog(@「invalid url:%@」,[NSURL URLWithString:urlString]);它顯示了我: 無效的網址:img/playgrounds.png – Stas 2012-02-13 13:22:49

+3

這就是爲什麼你應該說你已經試過你的問題。如果你的字符串是字面上的「img/playgrounds.png」,那麼它是正確的;這不是一個有效的網址。如果你試着用'http:// img.ly/playground.png',那麼它就可以工作。 – 2012-02-13 13:49:04

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

這個工程。謝謝 – kevinl 2016-02-16 17:14:04

7

我用這個解決方案,它顯然不是一個正則表達式檢查一個更好的和不太複雜的檢查 -

- (BOOL)isURL:(NSString *)inputString 
{ 
    NSURL *candidateURL = [NSURL URLWithString:inputString]; 
    return candidateURL && candidateURL.scheme && candidateURL.host; 
}