You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在NSAttributedString中处理十六进制颜色值

问题解决:NSAttributedString无法识别HTML中的颜色属性

问题根源

你提供的HTML里,颜色值#i00008B包含无效字符i——十六进制颜色仅允许使用0-9、A-F(或小写a-f)的字符。这个错误导致NSAttributedString解析HTML时直接忽略了该颜色样式,文本因此显示为默认的黑色。

解决方案

1. 直接修正原始HTML的颜色值

如果你能直接修改HTML内容,把错误的颜色值替换为合法的十六进制格式即可。比如你大概率是想写深蓝色#00008B,修正后的HTML如下:

<p>My <b> cat </b> has <span style="color:#00008B">blue</span> eyes.</p>

2. 动态预处理HTML(无法直接修改原始内容时)

如果HTML是动态获取的,无法直接编辑,可以在解析前添加字符串预处理逻辑,自动清理颜色值中的无效字符:

func fixInvalidHexColors(in html: String) -> String {
    // 匹配style中color:#xxx的格式,过滤无效字符
    return html.replacingOccurrences(of: #"(color:#)[^0-9A-Fa-f]+"#, with: { matchResult in
        let prefix = matchResult.captures[0] ?? "color:#"
        let rawColorPart = matchResult.string.dropFirst(prefix.count)
        // 只保留十六进制合法字符
        let validColorChars = rawColorPart.filter { "0123456789ABCDEFabcdef".contains($0) }
        // 确保颜色长度为6位(不足则截断,过长也取前6位)
        let validColorString = String(validColorChars.prefix(6))
        return prefix + validColorString
    }, options: .regularExpression)
}

然后修改你的解析方法,先预处理HTML再解析:

func toHTMLAttributedString() -> NSAttributedString? {
    let cleanedHTML = fixInvalidHexColors(in: self)
    guard let data = cleanedHTML.data(using: .unicode),
          let attrString = try? NSAttributedString(data: data,
                                                   options: [.documentType: NSAttributedString.DocumentType.html],
                                                   documentAttributes: nil) else {
        return nil
    }
    return attrString
}

3. 可选:使用其他NSAttributedString支持的颜色格式

除了合法的十六进制颜色,你也可以改用以下NSAttributedString完全兼容的颜色写法:

  • 颜色名称:color:blue
  • RGB格式:color:rgb(0, 0, 139)

内容的提问来源于stack exchange,提问作者Olivia Brown

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 06:10:32