从SwiftUI中的标记中删除内联样式

从SwiftUI中的标记中删除内联样式,swiftui,Swiftui,我正在拉入JSON数据,并在我的SwiftUI应用程序中用文本显示它,但有些文本在MD中包含内联样式。有没有办法删除它甚至应用这些样式 例如: if !ticket.isEmpty { Text(self.ticket.first?.notes.first?.prettyUpdatedString ?? "") .padding() Text(self.ticket.first?.notes.first?.mobileNoteText ?? &

我正在拉入JSON数据,并在我的SwiftUI应用程序中用文本显示它,但有些文本在MD中包含内联样式。有没有办法删除它甚至应用这些样式

例如:

if !ticket.isEmpty {
    Text(self.ticket.first?.notes.first?.prettyUpdatedString ?? "")
        .padding()
    Text(self.ticket.first?.notes.first?.mobileNoteText ?? "")
        .padding()
        .fixedSize(horizontal: false, vertical: true)
}
prettyUpdatedString打印出“Seth Duncan上次更新”

更新:

在尝试将此修复应用于票证简短详细信息时,将引发异常

Exception   NSException *   "*** -[NSRegularExpression enumerateMatchesInString:options:range:usingBlock:]: Range or index out of bounds"   0x0000600003f06370
我不知道这里发生了什么。有什么想法吗

正在从中提取数据shortDetail的示例

{
id: ID,
type: "Ticket",
lastUpdated: "2020-07-23T08:19:12Z",
shortSubject: null,
shortDetail: "broken screen - @ CEH Tina Desk",
displayClient: "STUDENT",
updateFlagType: 0,
prettyLastUpdated: "6 days ago",
latestNote: {
id: ID,
type: "TechNote",
mobileListText: "<b>S. Duncan: </b> Sent to AGI for repair.",
noteColor: "aqua",
noteClass: "bubble right"
}
},
{
id:id,
类型:“票证”,
最新更新:“2020-07-23T08:19:12Z”,
短主题:空,
shortDetail:“破碎的屏幕-@CEH Tina Desk”,
显示客户端:“学生”,
updateFlagType:0,
PrettyLastUpdate:“6天前”,
最新注:{
id:id,
类型:“技术说明”,
mobileListText:“S.Duncan:发送给AGI进行维修。”,
注:颜色:“水”,
noteClass:“泡沫权利”
}
},
错误代码

我正在尝试访问的屏幕…简短的详细信息在名称下面


我认为这里的诀窍是使用RegEx,在这种情况下,我将创建一个清除降价的函数

更新

根据我从您的评论中了解到的情况,您希望用空白代替,而不是空字符串

若要存档,我只需将的所有事件替换为一个空格“”

.replacingOccurrences(of:,with:)
给你留下这个密码

//原始答案的正则表达式不正确
func clearMarkdown(在str:String上)->String{
//我们构建markdown打开和关闭正则表达式,确保它们是有效的
guard let match=try?NSRegularExpression(模式:“]+>|\\n+”)else{return str}
//我们得到要分析的字符串的范围,在本例中是整个字符串
let range=NSRange(位置:0,长度:str.lengthOfBytes(使用:.utf8))
//我们匹配所有开盘价
让matches=match.matches(in:str,range:range)
//我们开始用空字符串替换
返回matches.reversed().reduce(into:str){current,结果为
让范围=范围(result.range,in:current)!
当前.replaceSubrange(范围,带:“”)
}.replacingOccurrences(of:,with:)
}
此函数将清除字符串中的所有标记样式,但它不会格式化字符串,也不会为您提供有关标记的任何信息。例如,用法如下

var str=“Seth Duncan上次更新”
str=clearMarkdown(on:str)//打印“Seth Duncan上次更新”而不带引号
如果你需要应用的样式将不会工作,但我可以写一些将

更新2

查看您的问题后,我发现您收到了两个字符串,其中的字符在UTF-8字符集中不可用。本例中的字符是ANSI中可用的
,而使用UTF-8的字符通常使用
。也就是说,您只需要通过

//替换此行
let range=NSRange(位置:0,长度:str.lengthOfBytes(使用:.utf8))
//与
let range=NSRange(位置:0,长度:str.lengthOfBytes(使用:.windowsCP1254))

我没有弄错,这是最完整的字符集之一,与ANSI字符集匹配(或非常匹配),您也可以使用我测试过的
.ascii
,并且似乎可以使用您想保留还是只删除上述样式?显然,两者都可以,但应用需要更多的工作。我只是想为你提供最好的答案,我更愿意删除它们谢谢,我会给你一个机会,让你知道它是如何运作的。太棒了。这似乎适用于所有情况,但是-我如何修改函数以删除它们?有什么问题吗?是否要将替换为空格?是的,这可能是最好的解决方案。在此处找到罪魁祸首,您的字符串包含utf8中不可用的字符,从而导致崩溃。将此行
let range=NSRange(位置:0,长度:str.lengthOfBytes(使用:.utf8))
更改为
let range=NSRange(位置:0,长度:str.lengthOfBytes(使用:.windowsCP1254))
我相信这与ANSI字符集相匹配,ANSI字符集是您也可以使用的更完整的字符集之一。
.ascii
我没有使用任何其他字符集进行测试,我真的建议使用
.windowsCP1254
。本例中的符号为
,在UTF-8中通常使用
这是一个很小的差异,但足以导致崩溃