如何快速检查NSString对象是否是有效的URL?

时间:2012-02-13 12:46:16

标签: iphone nsstring

帮我编写代码,“如果我的字符串是有效的URL,请执行smth” 是否可以用几串代码写出来?

5 个答案:

答案 0 :(得分:19)

我将假设通过URL,您指的是标识Internet资源位置的字符串。

如果您对输入字符串的格式有所了解,那么为什么不手动检查字符串是以http://https://还是您需要的任何其他方案开头的。如果您希望使用其他协议,也可以将其添加到检查列表中(例如ftp://mailto://等)



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

如果您正在寻找更可靠的解决方案并检测任何类型的URL方案,那么您应该使用正则表达式。

作为旁注,NSURL类旨在表达任何类型的资源位置(而不仅仅是Internet资源)。这就是为什么像img/demo.jpgfile://bla/bla/bla/demo.jpg这样的字符串可以转换为NSURL对象。

但是,根据文档,如果输入字符串不是有效的Internet资源字符串,则[NSURL URLWithString]应返回nil。在实践中它没有。

答案 1 :(得分: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);
}

答案 2 :(得分:6)

我使用这个解决方案,这显然比正则表达式检查更好,更复杂 -

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

答案 3 :(得分:1)

尝试用它创建NSUrl,看看它是否返回非零结果。

答案 4 :(得分:0)

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