如何在UITextView中找到第一个URL?

时间:2018-11-23 07:52:20

标签: ios swift

我有一个UITextView实现为:

let textView = UITextView()
textView.isEditable = false
textView.dataDetectorTypes = .link

我知道将数据检测器类型设置为链接意味着文本视图将自动查找链接,突出显示它们并使其超链接(使它们成为可点击的)。

我要弄清楚的是如何知道UITextView是否找到至少一个URL,并以编程方式对第一个URL进行处理。我曾考虑过使用正则表达式尝试查找常见的URL格式,但我希望与Apple进行检测的方式保持一致。

是否有一种方法可以从attributedText中提取URL,或者有一种更简单的方法?

我认为可以用这样的方法完成:

textView.attributedText.attribute(.link, at: 0, effectiveRange: 0..textView.text.count)

2 个答案:

答案 0 :(得分:1)

您可以像下面这样使用NSDataDetector

let text = "I usually search stuff on stackoverflow.com to find answers"
if let detector = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue) {

    let matches = detector.matches(in: text, options: [], range: NSRange(location: 0, length: text.utf16.count))

    for match in matches {
        guard let range = Range(match.range, in: text) else { continue }
        let url = text[range]
        print(url) // > stackoverflow.com
        // Here is the place where you can count your URLs or do whatever you want with it
    }

}

注意: -Swift 4中提供的示例 -如果文本较长,可能会影响性能 -该代码尚未通过表情符号和复杂的字形进行测试,因此您应该这样做。


Official NSDataDetector docs中阅读更多内容

答案 1 :(得分:0)

使用NSDataDetectorfirstMatch这样的方法。

let string = "Detecting first url from the string www.google.com and https://facebook.com"
do {
    let detector = try NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue)
    let range = NSRange(string.startIndex..<string.endIndex, in: string)
    if let firstMatch = detector.firstMatch(in: string, options: [], range: range) {
        print(firstMatch.url) // prints www.google.com
    } else {
        print("No url deteched")
    }
} catch {
}