【发布时间】:2012-02-13 12:46:15
【问题描述】:
帮我写“如果我的字符串是一个有效的 URL 做 smth”这样的代码 可以用几串代码来写吗?
【问题讨论】:
-
“有效”是指满足语法要求,还是指指向现有站点?
-
我需要正确的语法..
帮我写“如果我的字符串是一个有效的 URL 做 smth”这样的代码 可以用几串代码来写吗?
【问题讨论】:
我假设通过 URL,您指的是标识 Internet 资源位置的字符串。
如果您对输入字符串的格式有所了解,那么为什么不手动检查字符串是否以http://、https:// 或您需要的任何其他方案开头。如果您期望其他协议,您也可以将它们添加到检查列表中(例如ftp://、mailto:// 等)
if ([myString hasPrefix:@"http://"] || [myString hasPrefix:@"https://"])
{
// do something
}
如果您正在寻找更可靠的解决方案并检测任何类型的 URL 方案,那么您应该使用正则表达式。
附带说明,NSURL 类旨在表达任何类型的资源位置(不仅仅是互联网资源)。这就是为什么 img/demo.jpg 或 file://bla/bla/bla/demo.jpg 这样的字符串可以转换为 NSURL 对象。
但是,根据文档,如果输入字符串不是有效的 Internet 资源字符串,[NSURL URLWithString] 应该返回 nil。实际上并没有。
【讨论】:
+ (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);
}
【讨论】:
我使用了这个解决方案,它显然比正则表达式检查更好且更简单 -
- (BOOL)isURL:(NSString *)inputString
{
NSURL *candidateURL = [NSURL URLWithString:inputString];
return candidateURL && candidateURL.scheme && candidateURL.host;
}
【讨论】:
"" 或 "img/demo.jpg" 之类的东西,这可能不是 OP 的想法。
尝试用它创建NSUrl,看看它是否返回非零结果。
【讨论】:
if ([NSURL URLWithString:text]) {
// valid URL
}
else {
// invalid URL
}
【讨论】:
http://img.ly/playground.png,那么它会起作用。