如何从此字符串中仅获取链接?

Posted

技术标签:

【中文标题】如何从此字符串中仅获取链接?【英文标题】:How to get only link from this string? 【发布时间】:2016-11-25 07:55:38 【问题描述】:

我只想从此字符串中获取链接:

"<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     

并尝试了这个正则表达式:"&lt;a[^&gt;]+href=\"(.*?)\"[^&gt;]*&gt;.*?&lt;/a&gt;"

但我还是想不通。

【问题讨论】:

What is the best practice to parse html in swift?的可能重复 【参考方案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,等等。


还有另一种方法可以获取&lt;a&gt; ... &lt;/a&gt;标签之间的链接和其他特定字符串:

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

注意: 我建议您使用上述解决方案来获取链接,特别感谢。

【讨论】:

请注意,这不会提取链接目标(锚点中的href),而是提取&lt;a ..&gt;&lt;/a&gt; 之间的文本。该文本不必是链接,也不必等于 href。 @MartinR 我在这里尊重您的正确解释,我在我的情况下找到了这个可行的解决方案,这也是我建议的原因。你能详细说明一下这个That text need not be a link and need not be equal to the href,所以我会更新我并提出建议:) 我的意思是,对于let string = "&lt;p&gt;&lt;a href=\"https://www.google.com\"&gt;What??&lt;/a&gt;&lt;/p&gt;\n",您的代码将提取What?? 而不是https://www.google.com 好的现在明白你的意思&lt;a&gt; ... &lt;/a&gt;,我会寻找更好的解决方案,很高兴你能提供一些链接非常感谢:)

以上是关于如何从此字符串中仅获取链接?的主要内容,如果未能解决你的问题,请参考以下文章

如何从日期时间 C# 中仅获取时间 [关闭]

如何使用 REGEXP sql 从字符串中仅提取 5 位数字

如何使用 jquery 从 asp.net 列表框中仅获取当前选定的选项

正则表达式 - 从字符串中仅获取十进制数

JSON.NET:如何在没有数组的情况下从DataTable对象中仅序列化一行?

如何从此 URL 从文件中获取内容?