帮我编写代码,“如果我的字符串是有效的URL,请执行smth” 是否可以用几串代码写出来?
答案 0 :(得分:19)
我将假设通过URL,您指的是标识Internet资源位置的字符串。
如果您对输入字符串的格式有所了解,那么为什么不手动检查字符串是以http://
,https://
还是您需要的任何其他方案开头的。如果您希望使用其他协议,也可以将其添加到检查列表中(例如ftp://
,mailto://
等)
if ([myString hasPrefix:@"http://"] || [myString hasPrefix:@"https://"])
{
// do something
}
如果您正在寻找更可靠的解决方案并检测任何类型的URL方案,那么您应该使用正则表达式。
作为旁注,NSURL类旨在表达任何类型的资源位置(而不仅仅是Internet资源)。这就是为什么像img/demo.jpg
或file://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
}