iOS-地址URL判断

为什么要做这件事
最近公司需要一个自定义后台URL,使用常规的网上的判断网络地址URL正则表达是总是判断不准确。
经过多方求证,发现苹果对一些常用的正则匹配都作了封装,如时间、时区、网页链接url、电话号码等等。而且这些识别是国际化的,比如中国的手机号是13044345467,XX国的手机号是932-23333222,它都可以识别。又比如中国人的名字是王大锤,英国人的名字是 William Jafferson Clinton,也都能识别。

举例: 验证URL方法

  1. 常规出现错误示例

    匹配网址URL的正则表达式:
    [a-zA-z]+://[^\s]

1
2
3
4
5
//判断地址是否正确
- (BOOL)verifyWebUrlAddress:(NSString *)webUrl
{
return [webUrl isMatchWithRegexString:@"[a-zA-z]+://[^\s]*"];
}

出现问题:

URL地址中不能存在s,否则返回NO

因为本人目前对于正则表达的博大精深只理解了些皮毛,不知道作何修改,这时候发现了苹果对一些常用的正则匹配都作了封装,喜不自胜。

  1. 苹果对一些常用的正则匹配作了封装示例

    不用自己去写正则表达式匹配
    采用系统类NSDataDetector

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//判断地址是否正确
- (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() 方法来检测一个链接的有效性,比如上面样例可以改成如下的判断方式:

1
2
3
4
5
6
7
8
//判断地址是否正确
- (BOOL)verifyWebUrlAddress:(NSString *)webUrl
{
if (!webUrl) {
return NO;
}
return [UIApplication.sharedApplication canOpenURL:[NSURL URLWithString:webUrl]];
}

NSDataDetector的详细使用方法

-------------本文结束感谢您的阅读-------------

我的传送门:博客简书GitHub