当前位置: > > > Swift - 使用NSDataDetector进行URL验证,及提取字符串中所有链接

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

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

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

2,提取出字符串中所有的URL链接
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let str = "欢迎访问http://www.hangge.com,https://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链接
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() 方法来检测一个链接的有效性,比如上面样例可以改成如下的判断方式:
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()
    }
}
评论0