【问题标题】:Regular expression to extract href url正则表达式提取href url
【发布时间】:2017-04-25 00:11:31
【问题描述】:

我想用正则表达式从字符串中提取链接。我发现了一个类似的帖子here 并尝试了这段代码

let regex = try! NSRegularExpression(pattern: "<a[^>]+href=\"(.*?)\"[^>]*>.*?</a>")
        let range = NSMakeRange(0, text.characters.count)
        let htmlLessString :String = regex.stringByReplacingMatches(in: text,
                                                                            options: [],
                                                                            range:range ,
                                                                            withTemplate: "")

但是建议的正则表达式删除了href标签的所有内容。我的字符串看起来像

SOME stirng  <a href="https://com.mywebsite.com/yfgvh/f23/fsd" rel="DFGHJ"> some text I need to keep </a> and other text

预期的结果是

SOME stirng  https://com.mywebsite.com/yfgvh/f23/fsd some text I need to keep and other text

完美的结果是

SOME stirng some text I need to keep (https://com.mywebsite.com/yfgvh/f23/fsd) and other text

您是否知道是否可以实现这一目标?

【问题讨论】:

标签: regex swift


【解决方案1】:

当然它会删除 href 内容,因为您是 ...ReplaceingMatches...with 空字符串。

您的示例字符串与模式不匹配,因为缺少结束标记 &lt;/a&gt;

"&lt;a[^&gt;]+href=\"(.*?)\"[^&gt;]*&gt;" 模式一直检查到链接后的右尖括号。

捕获的组位于匹配的索引 1。此代码打印所有提取的链接:

let text = "<a href=\"https://com.mywebsite.com/yfgvh/f23/fsd\" rel=\"DFGHJ\">"

let regex = try! NSRegularExpression(pattern: "<a[^>]+href=\"(.*?)\"[^>]*>")
let range = NSMakeRange(0, text.characters.count)
let matches = regex.matches(in: text, range: range)
for match in matches {
    let htmlLessString = (text as NSString).substring(with: match.rangeAt(1))
    print(htmlLessString)
}

【讨论】:

    【解决方案2】:

    我不是 Swift 的常规开发者,但是,您是否尝试过像这样使用 stringByReplacingMatcheswithTemplateoption ?

    let regex = try! NSRegularExpression(pattern: "<a[^>]+href=\"(.*?)\"[^>]*>(.*)?</a>")
            let range = NSMakeRange(0, text.characters.count)
            let htmlLessString :String = regex.stringByReplacingMatches(in: 
                                                                     text,
                                                                     options: [], 
                                                                     range:range ,
                                                                     withTemplate: @"$2 ($1)")
    

    【讨论】:

    • 谢谢,这会保留 url 但删除 之间的文本
    • 不客气!要标记您的完美结果,请尝试withTemplate: @"($1)" 并在仔细检查时记住标记为已解决!哈哈
    • 当然,但正如我在评论中所写,此解决方案不会将文本保留在 之间
    • 哎呀,我没注意到,如果您更改此"&lt;a[^&gt;]+href=\"(.*?)\"[^&gt;]*&gt;(.*?)&lt;/a&gt;" 的正则表达式并更改withTemplate: @"$2 $1",它应该可以修复
    【解决方案3】:

    这个正则表达式似乎在这种情况下工作:href="(.*)" .*"&gt;(.*)&lt;\/a&gt;(.*),第 1 组将有你的 url,&lt;a&gt;&lt;/a&gt; 之间的第 2 组文本和&lt;a&gt;&lt;/a&gt; 之后的第 3 组文本,但是你必须使用这个扩展才能能够从群组中获取信息,因为没有本地群组支持:http://samwize.com/2016/07/21/how-to-capture-multiple-groups-in-a-regex-with-swift/

    【讨论】:

      猜你喜欢
      • 2018-11-28
      • 2023-03-27
      • 1970-01-01
      • 2014-03-22
      • 2011-07-09
      • 2013-04-04
      • 2017-12-09
      • 2016-04-21
      相关资源
      最近更新 更多