将字符串中的粗体字替换为Swift

时间:2018-08-08 08:47:29

标签: ios swift string substring uilabel

我有一个带有文本“ hello world, hello ”的UILabel。有2个问候词。 我想将唯一的“ bold hello ”替换为“感谢”,而不要使用粗体。

我使用以下代码:

  

uiLabel1.text =“你好,世界,你好

     

let target =“ hello”

     

让replace =“谢谢”

     

uiLabel1.text.replacingOccurrences(of:target,with:replace,options:   NSString.CompareOptions.literal,范围:无)

结果是:“感谢世界,谢谢”
我想要的结果是:“世界你好,谢谢”

2 个答案:

答案 0 :(得分:2)

好的,所以可能有一种更简单的方法...

因此,我浏览了API(例如超级快),并寻找了类似lastIndexOf的东西,这使我步入了String#range(of:options)的小径,这使您可以向后搜索,嗯,有趣

这将返回Range<String.Index> ...好吧,那我该如何使用呢?嗯,也许是String#replacingOccurrences(of:with:options:range:)

所以,打开一个游戏场地,然后...

var str = "hello world, hello"
let lastIndexOf = str.range(of: "hello", options: .backwards)
str = str.replacingOccurrences(of: "hello", with: "thanks", options: .caseInsensitive, range: lastIndexOf)

str现在等于"hello world, thanks"

  

您好,@ MadProgrammer,您的代码要替换最后一个问候词,对吗?但是我的问题是用粗体属性替换hello,它可以在字符串的开头,中间或结尾。

好的,很明显,我们缺少一些上下文信息...

假设现在您正在使用NSAttributedString,它会变得稍微复杂一些

构建字符串本身并不难,要弄清楚如何通过属性查找字符串组件,会更加困难。

很幸运,我们拥有互联网。因此,以下内容基于我的想法:

尝试解决问题时要记住的重要事情之一,您将很幸运地找到一个可以解决所有问题的答案,相反,您需要分解问题并专注于解决单个要素,并做到准备回到起点

所以,再次来到操场上...

import UIKit

var str = "hello world, "
//let lastIndexOf = str.range(of: "hello", options: .backwards)
//str = str.replacingOccurrences(of: "hello", with: "thanks", options: .caseInsensitive, range: lastIndexOf)

extension UIFont {
    var isBold: Bool {
        return fontDescriptor.symbolicTraits.contains(.traitBold)
    }

    var isItalic: Bool {
        return fontDescriptor.symbolicTraits.contains(.traitItalic)
    }
}

// Just so I can see that the style ;)    
let fontSize = CGFloat(24.0)
let boldAttrs = [
    NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: fontSize),
    NSAttributedString.Key.foregroundColor: UIColor.white // Playground
]
// Playground only
let plainAttrs = [
    NSAttributedString.Key.foregroundColor: UIColor.white // Playground
]

let boldText = NSMutableAttributedString(string: "hello", attributes: boldAttrs)
let styledText = NSMutableAttributedString(string: str, attributes: plainAttrs)
let someMoreBoldText = NSMutableAttributedString(string: "not to be replaced", attributes: boldAttrs)

// Attributes can be combined with their appear together ;)
styledText.append(boldText)
styledText.append(NSMutableAttributedString(string: " ", attributes: plainAttrs))
styledText.append(someMoreBoldText)
styledText.append(NSMutableAttributedString(string: " ", attributes: plainAttrs))
styledText.append(boldText)

styledText.enumerateAttribute(NSAttributedString.Key.font, in: NSRange(0..<styledText.length)) { (value, range, stop) in
    guard let font = value as? UIFont, font.isBold else {
        return;
    }
    let subText = styledText.attributedSubstring(from: range)
    guard subText.string == "hello" else {
        return
    }
    styledText.replaceCharacters(in: range, with: "thanks")
}
styledText

哪个输出...

Output

对我来说重要的是:

  1. 样式没有改变
  2. 仅单个粗体的“ hello”值已更改

答案 1 :(得分:0)

这是代码。但是实际上这是硬编码的。如果target放在<b></b>之间,它将起作用。

var text = "hello world, <b>hello</b>"
let target = "hello"
let replace = "thanks"

text = text.replacingOccurrences(of: "<b>\(target)</b>", with: replace, options: .literal, range: nil) //hello world, thanks