Swift - 使用NSDataDetector进行URL验证,及提取字符串中所有链接

82 篇文章 1 订阅
要匹配字符串里的URL链接地址,我们可以使用  NSRegularExpression 进行正则匹配,具体用法可以看我原来写的这篇文章: Swift - 正则表达式的使用(附用户名、邮箱、URL等常用格式验证)
但使用  NSRegularExpression  由于需要自己写正则表达式,略显麻烦。我们还有个更简单的寻找数据的解决方案: NSDataDetector

1,NSDataDetector介绍
NSDataDetector 是继承于  NSRegularExpression 的一个子类。使用的时候只需要指定要匹配的类型(日期、地址、URL等)就可以提取的想要的信息,而不需要自己再写复杂的表达式。

2,提取出字符串中所有的URL链接
原文:Swift - 使用NSDataDetector进行URL验证,及提取字符串中所有链接
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import  UIKit
 
class  ViewController UIViewController  {
 
     override  func  viewDidLoad() {
         super .viewDidLoad()
 
         let  str =  "欢迎访问http://www.hangge.comhttps://hangge.com\n以及ftp://hangge.com"
         print ( "测试字符串式:\n\(str)\n" )
         
         print ( "匹配到的链接:" )
         let  urls = getUrls(str)
         for  url  in  urls {
             print (url)
         }
     }
     
     /**
      匹配字符串中所有的URL
      */
     private  func  getUrls(str: String ) -> [ String ] {
         var  urls = [ String ]()
         // 创建一个正则表达式对象
         do {
             let  dataDetector = try  NSDataDetector (types:
                 NSTextCheckingTypes ( NSTextCheckingType . Link .rawValue))
             // 匹配字符串,返回结果集
             let  res = dataDetector.matchesInString(str,
                 options:  NSMatchingOptions (rawValue: 0),
                 range:  NSMakeRange (0, str.characters.count))
             // 取出结果
             for  checkingRes  in  res {
                 urls.append((str  as  NSString ).substringWithRange(checkingRes.range))
             }
         }
         catch {
             print (error)
         }
         return  urls
     }
 
     override  func  didReceiveMemoryWarning() {
         super .didReceiveMemoryWarning()
     }
}

3,验证字符串是不是一个有效的URL链接
原文:Swift - 使用NSDataDetector进行URL验证,及提取字符串中所有链接
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import  UIKit
 
class  ViewController UIViewController  {
     
     override  func  viewDidLoad() {
         super .viewDidLoad()
         
         let  str1 =  "欢迎访问http://www.hangge.com"
         print (str1)
         print (verifyUrl(str1))
         
         let  str2 =  "http://www.hangge.com"
         print (str2)
         print (verifyUrl(str2))
     }
     
     /**
      验证URL格式是否正确
      */
     private  func  verifyUrl(str: String ) ->  Bool  {
         // 创建一个正则表达式对象
         do {
             let  dataDetector = try  NSDataDetector (types:
                 NSTextCheckingTypes ( NSTextCheckingType . Link .rawValue))
             // 匹配字符串,返回结果集
             let  res = dataDetector .matchesInString(str,
                 options:  NSMatchingOptions (rawValue: 0),
                 range:  NSMakeRange (0, str.characters.count))
             // 判断结果(完全匹配)
             if  res.count == 1  && res[0].range.location == 0
                 && res[0].range.length == str.characters.count {
                     return  true
             }
         }
         catch {
             print (error)
         }
         return  false
     }
     
     override  func  didReceiveMemoryWarning() {
         super .didReceiveMemoryWarning()
     }
}

注意:验证URL链接更简单的办法
我们还可以借助系统提供的  canOpenURL() 方法来检测一个链接的有效性,比如上面样例可以改成如下的判断方式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import  UIKit
 
class  ViewController UIViewController  {
     
     override  func  viewDidLoad() {
         super .viewDidLoad()
         
         let  str1 =  "欢迎访问http://www.hangge.com"
         print (str1)
         print (verifyUrl(str1))
         
         let  str2 =  "http://www.hangge.com"
         print (str2)
         print (verifyUrl(str2))
     }
     
     /**
      验证URL格式是否正确
      */
     private  func  verifyUrl(str: String ) ->  Bool  {
         //创建NSURL实例
         if  let  url =  NSURL (string: str) {
             //检测应用是否能打开这个NSURL实例
             return  UIApplication .sharedApplication().canOpenURL(url)
         }
         return  false
     }
     
     override  func  didReceiveMemoryWarning() {
         super .didReceiveMemoryWarning()
     }
}

原文出自: www.hangge.com   转载请保留原文链接: http://www.hangge.com/blog/cache/detail_1105.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值