Swift 将html转换为字符串-尾随新行

Swift 将html转换为字符串-尾随新行,swift,string,nsattributedstring,Swift,String,Nsattributedstring,我正在开发一个应用程序,在这个应用程序中,我从端点获取数据,然后将它们显示给用户。我得到的大多数“字符串”数据是html格式的,所以我需要将其转换为字符串。除了删除尾随的新行字符外,所有操作都正常。以下是我正在使用的扩展: 数据扩展: extension Data { var htmlToAttributedString: NSAttributedString? { do { return try NSAttributedString(data:

我正在开发一个应用程序,在这个应用程序中,我从端点获取数据,然后将它们显示给用户。我得到的大多数“字符串”数据是html格式的,所以我需要将其转换为字符串。除了删除尾随的新行字符外,所有操作都正常。以下是我正在使用的扩展:

数据扩展:

extension Data {
    var htmlToAttributedString: NSAttributedString? {
        do {
            return try NSAttributedString(data: self, options: [.documentType: NSAttributedString.DocumentType.html, .characterEncoding: String.Encoding.utf8.rawValue], documentAttributes: nil)
        } catch {
            print("error:", error)
            return  nil
        }
    }
    var htmlToString: String {
        return htmlToAttributedString?.string ?? ""
    }
}
extension String {
    var htmlToAttributedString: NSAttributedString? {
         return Data(utf8).htmlToAttributedString
    }
    var htmlToString: String {
        return htmlToAttributedString?.string ?? ""
    }
}
字符串扩展名:

extension Data {
    var htmlToAttributedString: NSAttributedString? {
        do {
            return try NSAttributedString(data: self, options: [.documentType: NSAttributedString.DocumentType.html, .characterEncoding: String.Encoding.utf8.rawValue], documentAttributes: nil)
        } catch {
            print("error:", error)
            return  nil
        }
    }
    var htmlToString: String {
        return htmlToAttributedString?.string ?? ""
    }
}
extension String {
    var htmlToAttributedString: NSAttributedString? {
         return Data(utf8).htmlToAttributedString
    }
    var htmlToString: String {
        return htmlToAttributedString?.string ?? ""
    }
}
代码示例:

let descriptionHtml = "\n<p>Rømø beach is still a young beach and created from blown sand so fine that it resembles tiny diamonds. All year round, from morning to evening, there will be activity on the beach, known as one of Northern Europe&#8217;s absolute best and widest.</p>\n"
let descriptionAsString = descriptionHtml.htmlToString

//Expected result: "Rømø beach is still a young beach and created from blown sand so fine that it resembles tiny diamonds. All year round, from morning to evening, there will be activity on the beach, known as one of Northern Europe’s absolute best and widest."
//  Actual result: "Rømø beach is still a young beach and created from blown sand so fine that it resembles tiny diamonds. All year round, from morning to evening, there will be activity on the beach, known as one of Northern Europe’s absolute best and widest.\n"
//
let descriptionHtml=“\nRømøbeach仍然是一个年轻的海滩,由吹制的沙子制成,非常细,酷似微小的钻石。一年四季,从早到晚,海滩上都会有活动,被称为北欧最佳和最宽的海滩之一。

\n 让descriptionAsString=descriptionHtml.htmlToString //预期结果:“Rømøbeach仍然是一个年轻的海滩,它是由吹制的沙子制成的,非常细,像微小的钻石。全年,从早上到晚上,海滩上都会有活动,被称为北欧绝对最好、最宽的海滩之一。” //实际结果:“Rømøbeach仍然是一个年轻的海滩,它是由吹制的沙子制成的,非常细,像微小的钻石。全年,从早上到晚上,海滩上都会有活动,被称为北欧绝对最好、最宽的海滩之一。\n” //

我可以通过将
“\n”
替换为
来简单地解决这个问题,但我似乎不是一个温和的解决方案,因为我使用的是实际的NSAttributedString初始值设定项,这让我很惊讶,它没有像我预期的那样工作。是否有任何原因将新行字符保留在末尾,是否有任何方法可以在不手动替换新行字符的情况下修复它?

此文本包装在
标记中。通常,如果进行渲染,则会以换行符结束。这应该是预期的行为。如果您不希望这是“段落式”的,那么它不应该位于
标记中


如果删除
,但保留最后一个
\n
,它将使用尾随空格呈现,这是HTML中呈现换行符的正常方式。同样,这应该是预期的行为。您正在呈现HTML。这允许您将HTML分块呈现,并以合理的方式将结果字符串粘合在一起。

此文本包装在
标记中。通常,如果进行渲染,则会以换行符结束。这应该是预期的行为。如果您不希望这是“段落式”的,那么它不应该位于
标记中


如果删除
,但保留最后一个
\n
,它将使用尾随空格呈现,这是HTML中呈现换行符的正常方式。同样,这应该是预期的行为。您正在呈现HTML。这允许您将HTML分块呈现,并以合理的方式将结果字符串粘合在一起。

如果我提取的字符串数据没有以新行字符结尾,该怎么办?这不是一个解决办法。我已经提到,如果我想手动执行此操作,我可以使用此方法将新行字符替换为空字符串:如果我提取的字符串数据不以新行字符结尾,该怎么办?这不是一个解决办法。我已经提到,如果我想手动执行此操作,我可以使用此方法将新行字符替换为空字符串:我无法删除标记,因为我正在从端点获取数据,我提供的示例代码只是问题的硬编码表示。@schemabuoi所以只需处理结果字符串
descriptionHtml.htmlToString.filter{!$0.isWhitespace}
。如果您的目的是只删除字符串末尾的空格
descriptionHtml.htmlToString.trimmingCharacters(in:.whitespaces)
请与Leo协商。渲染器正在做正确的事情。如果您不想这样做,应该对字符串进行后期处理。@LeoDabus您的任何解决方案都不起作用。第一个删除了单词之间的空格,第二个根本不起作用。但这并不重要,如果我想要一个简单的解决方案,我将使用我在我的问题下的评论中提到的方法,我只是在寻找一些“更温和”的东西,而不是简单的字符串manipulation@schemabuoi抱歉发布了错误的属性
descriptionHtml.htmlToString.filter{!$0.isNewline}
descriptionHtml.htmlotstring.trimmingCharacters(in:.newlines)
我无法删除标记,因为我正在从端点获取数据,我提供的示例代码只是问题的硬编码表示。@schemaboi所以只需处理结果字符串
descriptionHtml.htmlotstring.filter{!$0.isWhitespace}
。如果您的目的是只删除字符串末尾的空格
descriptionHtml.htmlToString.trimmingCharacters(in:.whitespaces)
请与Leo协商。渲染器正在做正确的事情。如果您不想这样做,应该对字符串进行后期处理。@LeoDabus您的任何解决方案都不起作用。第一个删除了单词之间的空格,第二个根本不起作用。但这并不重要,如果我想要一个简单的解决方案,我将使用我在我的问题下的评论中提到的方法,我只是在寻找一些“更温和”的东西,而不是简单的字符串manipulation@schemabuoi抱歉发布了错误的属性
descriptionHtml.htmlToString.filter{!$0.isNewline}
descriptionHtml.htmlToString.trimmingCharacters(在:。换行符中)