1

如何检查 UISearchBar.text 是否包含 URL?我想过做这样的事情:

if (searchBar.text == NSTextCheckingType.Link) {

}

但我得到了错误:

String is not convertible to NSObject
4

2 回答 2

3

我增强了Imanou PETIT's anwser。

这允许您从字符串中提取多个 URL。

extension String {
    var extractURLs: [NSURL] {
        var urls : [NSURL] = []
        var error: NSError?
        let detector = NSDataDetector(types: NSTextCheckingType.Link.rawValue, error: &error)

        var text = self

        detector!.enumerateMatchesInString(text, options: nil, range: NSMakeRange(0, count(text)), usingBlock: { (result: NSTextCheckingResult!, flags: NSMatchingFlags, stop: UnsafeMutablePointer<ObjCBool>) -> Void in
            //            println("\(result)")
            //            println("\(result.URL)")
            urls.append(result.URL!)
        })

        return urls
    }
}

一个示例用法:

var urls = text.extractURLs
for url in urls {  
     // do stuff with your URL        
     if UIApplication.sharedApplication().canOpenURL(url) {
         UIApplication.sharedApplication().openURL(url)
         break
     }
}
于 2015-04-29T18:19:46.773 回答
3

使用 Swift 3,您可以使用NSDataDetector. NSDataDetector有一个名为init(types:). init(types:)有以下声明:

init(types checkingTypes: NSTextCheckingTypes) throws

初始化并返回一个数据检测器实例。

为了创建一个查找 url 的数据检测器,您必须将NSTextCheckingResult.CheckingType.link作为init(types:).


#1。使用NSDataDetectorandNSRegularExpressionenumerateMatches(in:options:range:using:)方法

作为 的子类NSRegularExpressionNSDataDetector有一个名为 的方法enumerateMatches(in:options:range:using:)enumerateMatches(in:options:range:using:)有以下声明:

func enumerateMatches(in string: String, options: NSRegularExpression.MatchingOptions = [], range: NSRange, using block: (NSTextCheckingResult?, NSRegularExpression.MatchingFlags, UnsafeMutablePointer<ObjCBool>) -> Void)

枚举允许 Block 处理每个正则表达式匹配的字符串。

下面的 Playground 代码显示了如何使用NSDataDetectorenumerateMatches(in:options:range:using:)方法来检测 a 是否String包含URLs:

import Foundation

let testString = " lorem http://www.yahoo.com ipsum google.fr"

do {
    let detector = try NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue)
    let range = NSRange(location: 0, length: testString.characters.count)
    let block = { (result: NSTextCheckingResult?, flags: NSRegularExpression.MatchingFlags, stop: UnsafeMutablePointer<ObjCBool>) -> Void in
        if let result = result, result.resultType == NSTextCheckingResult.CheckingType.link {
            print(result.url)
        }
    }
    detector.enumerateMatches(in: testString, options: [], range: range, using: block)
} catch {
    print(error)
}

/*
 prints:
 Optional(http://www.yahoo.com)
 Optional(http://google.fr)
 */

#2。使用NSDataDetectorandNSRegularExpressionmatches(in:options:range:)方法

作为 的子类NSRegularExpressionNSDataDetector有一个名为 的方法matches(in:options:range:)matches(in:options:range:)有以下声明:

func matches(in string: String, options: NSRegularExpression.MatchingOptions = [], range: NSRange) -> [NSTextCheckingResult]

返回一个数组,其中包含字符串中正则表达式的所有匹配项。

这是一个方便的方法,它调用enumerateMatches(in:options:range:using:)传递适当的字符串、选项和范围。

下面的 Playground 代码显示了如何使用NSDataDetectormatches(in:options:range:)方法来检测 a 是否String包含URLs:

import Foundation

let testString = " lorem http://www.yahoo.com ipsum google.fr"

do {
    let detector = try NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue)
    let range = NSRange(location: 0, length: testString.characters.count)
    let resultArray = detector.matches(in: testString, options: [], range: range)
    for result in resultArray {
        if result.resultType == NSTextCheckingResult.CheckingType.link {
            print(result.url)
        }
    }
} catch {
    print(error)
}

/*
 prints:
 Optional(http://www.yahoo.com)
 Optional(http://google.fr)
 */
于 2014-08-29T18:34:49.050 回答