要匹配字符串里的URL链接地址,我们可以使用
NSRegularExpression 进行正则匹配,具体用法可以看我原来写的这篇文章:
Swift - 正则表达式的使用(附用户名、邮箱、URL等常用格式验证)
但使用
NSRegularExpression
由于需要自己写正则表达式,略显麻烦。我们还有个更简单的寻找数据的解决方案:
NSDataDetector
。
NSDataDetector 是继承于
NSRegularExpression 的一个子类。使用的时候只需要指定要匹配的类型(日期、地址、URL等)就可以提取的想要的信息,而不需要自己再写复杂的表达式。
2,提取出字符串中所有的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()
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链接
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()
print
(str1)
print
(verifyUrl(str1))
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() 方法来检测一个链接的有效性,比如上面样例可以改成如下的判断方式:
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()
print
(str1)
print
(verifyUrl(str1))
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