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()
}
}
