2016-11-25 55 views
0

我想仅从这串链接:如何从此字符串获取链接?

"<p><a href=\"https://www.youtube.com/watch?v=i2yscjyIBsk\">https://www.youtube.com/watch?v=i2yscjyIBsk</a></p>\n" 

我想为https://www.youtube.com/watch?v=i2yscjyIBsk

输出,所以,我怎么能我实现吗?

我曾尝试:

func matches(for regex: String, in text: String) -> [String] { 
do { 
let regex = try NSRegularExpression(pattern: regex) 
let nsString = text as NSString 
    let results = regex.matches(in: text, range: NSRange(location: 0, length: nsString.length)) 
    return results.map { nsString.substring(with: $0.range)} 
} catch let error {     
} 

并试用了此正则表达式:"<a[^>]+href=\"(.*?)\"[^>]*>.*?</a>"

但我仍然无法弄清楚。

+0

的[什么是迅速解析HTML的最佳实践?](可能的复制http://stackoverflow.com/questions/31080818/what-is-the-best-practice-to-parse-html-in -swift) – Pascal

回答

1

使用NSDataDetector类,你可以准确提取链接:

let text = "<p><a href=\"https://www.youtube.com/watch?v=i2yscjyIBsk\">https://www.youtube.com/watch?v=i2yscjyIBsk</a></p>\n" 
let types: NSTextCheckingType = .Link 
let detector = try? NSDataDetector(types: types.rawValue) 

guard let detect = detector else { 
    return 
} 

let matches = detect.matchesInString(text, options: .ReportCompletion, range: NSMakeRange(0, text.characters.count)) 

for match in matches { 
    print(match.URL!) 
} 

说明:NSDataDetector类可以匹配日期,地址,链接,电话号码和交通信息。 Reference

匹配内容的结果返回为NSTextCheckingResult对象。但是,由NSDataDetector返回的NSTextCheckingResult对象与基类NSRegularExpression返回的对象不同。

NSDataDetector返回的结果将是数据检测器类型之一,具体取决于返回结果的类型,它们将具有相应的属性。例如,类型日期的结果有一个日期,timeZone和持续时间;类型链接的结果有url等等。


还有另一种方式来获得<a> ... </a>标签之间的链接及其他特定的字符串:

let string = "<p><a href=\"https://www.youtube.com/watch?v=i2yscjyIBsk\">https://www.youtube.com/watch?v=i2yscjyIBsk</a></p>\n" 
let str = string.stringByReplacingOccurrencesOfString("<[^>]+>", withString: "", options: .RegularExpressionSearch, range: nil) 
print("string: \(str)") 

输出:

string: https://www.youtube.com/watch?v=i2yscjyIBsk 

注:我建议你使用上面解决方案以获得链接,特别感谢。

+0

请注意,这不会提取链接目标(anchor中的href),而是在'' and ''之间的*文本*。该文本不必是链接,不必等于href。 –

+1

@MartinR我在这里尊重你的正确解释,我在我的案例中发现了这个工作解决方案,这就是我为什么提出的建议。你能否详细说明一下这个'这个文本不需要是链接,不需要等同于href'所以我更新我和暗示:) – vaibhav

+2

我的意思是'let string ='

What??

\ n “'你的代码将提取什么?'而不是'https:// www.google.com'。 –