2017-04-24 202 views
0

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

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 

你有是否有可能实现这一点的想法?

+0

正如您使用分组(因为我认为您想保留字符串)。你为什么不使用nstextcheckingresult - https://developer.apple.com/reference/foundation/nstextcheckingresult现在通过你的匹配循环http://stackoverflow.com/questions/13707187/regex-to-extract-all-the-substrings在两个字符之间或标签之间,你可以在这里看到,并且只在后缀“\”[^>] *>。*?处替换前缀“] + href = \”“? – Lepidopteron

+2

使用'NSDataDetector'实现内置功能您是否尝试过使用该函数而不是构建自己的正则表达式? –

回答

1

我不是Swift的常规开发者,但是,您是否尝试过使用stringByReplacingMatches这样的withTemplate选项?

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)") 
+0

谢谢,这会保留url但删除之间的文本 –

+0

欢迎您! withTemplate:@“($ 1)”'并记住标记为已解决,当你仔细检查它!haha – dloeda

+0

当然,但正如我在评论中写道的,此解决方案不保留之间的文本和 –

2

当然因为你是... ReplacingMatches它删除href内容......与空字符串。

您的示例字符串与模式不匹配,因为结束标记</a>缺失。

模式"<a[^>]+href=\"(.*?)\"[^>]*>"检查直到链接后的关闭角括号。

捕获的组位于比赛的索引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) 
}