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

Sta*_*tas 7 iphone nsstring

帮我编写代码,如"如果我的字符串是一个有效的URL,请执行smth"是否可以用几行代码编写它?

And*_*scu 19

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

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



if ([myString hasPrefix:@"http://"] || [myString hasPrefix:@"https://"])
{
    // do something
}
Run Code Online (Sandbox Code Playgroud)

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

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

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


Mar*_*kII 7

+ (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);
}
Run Code Online (Sandbox Code Playgroud)


Nis*_*ant 6

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

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