【问题标题】:How to quickly check if NSString object is a valid url?如何快速检查 NSString 对象是否为有效 url?
【发布时间】:2012-02-13 12:46:15
【问题描述】:

帮我写“如果我的字符串是一个有效的 URL 做 smth”这样的代码 可以用几串代码来写吗?

【问题讨论】:

  • “有效”是指满足语法要求,还是指指向现有站点?
  • 我需要正确的语法..

标签: iphone nsstring


【解决方案1】:

我假设通过 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 对象。

但是,根据文档,如果输入字符串不是有效的 Internet 资源字符串,[NSURL URLWithString] 应该返回 nil。实际上并没有。

【讨论】:

  • 很好的答案!谢谢。最重要的是它对我来说很好用。
【解决方案2】:
+ (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);
}

【讨论】:

    【解决方案3】:

    我使用了这个解决方案,它显然比正则表达式检查更好且更简单 -

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

    【讨论】:

    • 该方法将接受 @andrei-stanescu 指出的 """img/demo.jpg" 之类的东西,这可能不是 OP 的想法。
    【解决方案4】:

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

    【讨论】:

    • 我已经试过了: if ([NSURL urlWithString:urlString] != nil){ } 但由于某种原因它只是返回我的字符串! (虽然方法描述说如果字符串不是有效的url,它必须返回nil..不知道为什么)
    【解决方案5】:
    if ([NSURL URLWithString:text]) {
      // valid URL
    }
    else {
      // invalid URL
    }
    

    【讨论】:

    • 这就是它不起作用的关键......我遇到了一个奇怪的错误还是什么???我有一个日志 if NSLog(@"invalid url:%@", [NSURL URLWithString:urlString]);它告诉我:无效的 url:img/playgrounds.png
    • 这就是为什么您应该在问题中说出您已经尝试过的内容。如果您的字符串字面上是“img/playgrounds.png”,那么它是正确的;这不是一个有效的 URL。如果您尝试使用http://img.ly/playground.png,那么它会起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 2013-11-09
    • 2010-12-20
    • 1970-01-01
    • 2016-08-01
    相关资源
    最近更新 更多