2012-02-13 90 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; 
}