Swift-用空格替换字符串中的表情符号 [英] Swift - Replacing emojis in a string with whitespace
本文介绍了Swift-用空格替换字符串中的表情符号的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个方法可以检测字符串中的URL,并向我返回URL和可以找到它们的范围。一切都很完美,直到有了表情符号。例如:
"I'm gonna do this callenge as soon as I can swing again 😂😂😂
http://youtu.be/SW_d3fGz1hk"
由于表情符号,从文本中提取的url是http://youtu.be/SW_d3fGz1而不是http://youtu.be/SW_d3fGz1hk。我认为最简单的解决方案是将字符串上的emoji替换为空格字符(因为我需要一些文本样式的范围是正确的)。问题是,使用SWIFT很难做到这一点(很可能我缺乏使用SWIFT字符串API的能力)。
我一直在尝试这样做,但似乎无法从Unicode点数组创建字符串:
var emojilessStringWithSubstitution: String {
let emojiRanges = [0x1F601...0x1F64F, 0x2702...0x27B0]
let emojiSet = Set(emojiRanges.flatten())
let codePoints: [UnicodeScalar] = self.unicodeScalars.map {
if emojiSet.contains(Int($0.value)) {
return UnicodeScalar(32)
}
return $0
}
return String(codePoints)
}
我处理这个问题的方式错了吗?取代表情符号是最好的解决方案吗?如果是,我如何才能做到这一点?
推荐答案
您可以使用模式匹配(针对表情符号模式)从String
中筛选出表情符号。
extension String {
var emojilessStringWithSubstitution: String {
let emojiPatterns = [UnicodeScalar(0x1F601)...UnicodeScalar(0x1F64F),
UnicodeScalar(0x2702)...UnicodeScalar(0x27B0)]
return self.unicodeScalars
.filter { ucScalar in !(emojiPatterns.contains{ $0 ~= ucScalar }) }
.reduce("") { $0 + String($1) }
}
}
/* example usage */
let str = "I'm gonna do this callenge as soon as I can swing again 😂😂😂
http://youtu.be/SW_d3fGz1hk"
print(str.emojilessStringWithSubstitution)
/* I'm gonna do this callenge as soon as I can swing again
http://youtu.be/SW_d3fGz1hk */
请注意,上面仅使用了您的问题中提供的emoji间隔,并不代表所有emoji,但该方法是通用的,可以通过在emojiPatterns
数组中包含其他emoji间隔来快速扩展。
我意识到再次阅读您的问题时,您更喜欢用空格字符替换emoji,而不是删除它们(上面的过滤解决方案确实做到了)。我们可以通过将上面的.filter
操作替换为条件返回.map
操作来实现这一点,这与您的问题中的
extension String {
var emojilessStringWithSubstitution: String {
let emojiPatterns = [UnicodeScalar(0x1F600)...UnicodeScalar(0x1F64F),
UnicodeScalar(0x1F300)...UnicodeScalar(0x1F5FF),
UnicodeScalar(0x1F680)...UnicodeScalar(0x1F6FF),
UnicodeScalar(0x2600)...UnicodeScalar(0x26FF),
UnicodeScalar(0x2700)...UnicodeScalar(0x27BF),
UnicodeScalar(0xFE00)...UnicodeScalar(0xFE0F)]
return self.unicodeScalars
.map { ucScalar in
emojiPatterns.contains{ $0 ~= ucScalar } ? UnicodeScalar(32) : ucScalar }
.reduce("") { $0 + String($1) }
}
}
如上所述,现有的emoji表情间隔已经延长,根据您对此帖子的评论(列出这些间隔),因此现在可能会对emoji表情进行详尽的检查。
这篇关于Swift-用空格替换字符串中的表情符号的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文