为什么要做这件事
最近公司需要一个自定义后台URL,使用常规的网上的判断网络地址URL正则表达是总是判断不准确。
经过多方求证,发现苹果对一些常用的正则匹配都作了封装,如时间、时区、网页链接url、电话号码等等。而且这些识别是国际化的,比如中国的手机号是13044345467,XX国的手机号是932-23333222,它都可以识别。又比如中国人的名字是王大锤,英国人的名字是 William Jafferson Clinton,也都能识别。
举例: 验证URL方法
- 常规出现错误示例
匹配网址URL的正则表达式:
[a-zA-z]+://[^\s]
//判断地址是否正确
- (BOOL)verifyWebUrlAddress:(NSString *)webUrl
{
return [webUrl isMatchWithRegexString:@"[a-zA-z]+://[^\s]*"];
}
出现问题:
URL地址中不能存在
s
,否则返回NO
因为本人目前对于正则表达
的博大精深只理解了些皮毛,不知道作何修改,这时候发现了苹果对一些常用的正则匹配都作了封装,喜不自胜。
- 苹果对一些常用的正则匹配作了封装示例
不用自己去写正则表达式匹配
采用系统类NSDataDetector
。
//判断地址是否正确
- (BOOL)verifyWebUrlAddress:(NSString *)webUrl
{
NSError *error = nil;
NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink
error:&error];
NSArray *matches = [detector matchesInString:webUrl
options:nil
range:NSMakeRange(0, webUrl.length)];
if (matches.count == 1) {
NSTextCheckingResult *result = matches.firstObject;
if (result.range.location == 0) {
return YES;
} else {
return NO;
}
} else {
return NO;
}
}
不过,在查找方法过程中,发现
验证URL链接更简单的办法我们还可以借助系统提供的 canOpenURL() 方法来检测一个链接的有效性,比如上面样例可以改成如下的判断方式:
//判断地址是否正确
- (BOOL)verifyWebUrlAddress:(NSString *)webUrl
{
if (!webUrl) {
return NO;
}
return [UIApplication.sharedApplication canOpenURL:[NSURL URLWithString:webUrl]];
}