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