如何在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
相关产品推荐
相关产品推荐

