如何对CSS进行转义

时间:2019-07-29 06:48:05

标签: html css go

存储在数据库中的文本还包括CSS样式。

<p>ABC&nbsp;&nbsp;| Min. XYZ&nbsp;
<style type="text/css"><!--td {border: 1px solid #ccc;}br {mso-data-placement:same-cell;}-->
</style>
<span data-sheets-userformat="{&quot;2&quot;:3011,&quot;3&quot;:{&quot;1&quot;:0},&quot;4&quot;:[null,2,16777215],&quot;9&quot;:1,&quot;10&quot;:1,&quot;11&quot;:4,&quot;12&quot;:0,&quot;14&quot;:[null,2,0]}" data-sheets-value="{&quot;1&quot;:2,&quot;2&quot;:&quot;PQR&quot;}" style="font-size: 10pt; font-family: Arial; color: rgb(0, 0, 0); text-align: center;">PQR</span></p>

要摆脱&nbsp,我使用了html.Unescape(),它的工作原理非常好。

从数据库中获取后,我想以以下格式显示它:ABC | Min. XYZ PQR

但是实际结果(使用html.Unescape()之后)是:

ABC | Min. XYZ
<style type="text/css">
    <!--td {border: 1px solid #ccc;}br {mso-data-placement:same-cell;}-->
</style>
<span data-sheets-userformat="{&quot;2&quot;:3011,&quot;3&quot;:{&quot;1&quot;:0},&quot;4&quot;:[null,2,16777215],&quot;9&quot;:1,&quot;10&quot;:1,&quot;11&quot;:4,&quot;12&quot;:0,&quot;14&quot;:[null,2,0]}" data-sheets-value="{&quot;1&quot;:2,&quot;2&quot;:&quot;PQR&quot;}" style="font-size: 10pt; font-family: Arial; color: rgb(0, 0, 0); text-align: center;">PQR</span></p>

1 个答案:

答案 0 :(得分:0)

这似乎很简单,但是需要您做三件事:

  1. 剥离所有HTML标签,例如<p><style type="text/css">
  2. &nbsp;这样的Unescape HTML实体
  3. 用单个空格替换换行符,多个空格和不间断空格(U+00A0

您可以使用github.com/microcosm-cc/bluemondayhtmlstrings通过以下操作做到这一点:

// Your input text
input := `<p>ABC&nbsp;&nbsp;| Min. XYZ&nbsp;
<style type="text/css"><!--td {border: 1px solid #ccc;}br {mso-data-placement:same-cell;}-->
</style>
<span data-sheets-userformat="{&quot;2&quot;:3011,&quot;3&quot;:{&quot;1&quot;:0},&quot;4&quot;:[null,2,16777215],&quot;9&quot;:1,&quot;10&quot;:1,&quot;11&quot;:4,&quot;12&quot;:0,&quot;14&quot;:[null,2,0]}" data-sheets-value="{&quot;1&quot;:2,&quot;2&quot;:&quot;PQR&quot;}" style="font-size: 10pt; font-family: Arial; color: rgb(0, 0, 0); text-align: center;">PQR</span></p>`

// Strip all HTML tags
p := bluemonday.StrictPolicy()

output := p.Sanitize(input)

// Unescape HTML entities
output = html.UnescapeString(output)

// Condense whitespace
output = strings.Join(strings.Fields(strings.TrimSpace(output)), " ")

输出现在为ABC | Min. XYZ PQR

对于最后一步,使用strings.Fields看起来比使用正则表达式更干净,因为\s不包含不间断空格(U+00A0),因此需要满足以下条件:

// Leading and trailing spaces
output = regexp.MustCompile(`^[\s\p{Zs}]+|[\s\p{Zs}]+$`).ReplaceAllString(output, "")
// middle spaces
output = regexp.MustCompile(`[\s\p{Zs}]{2,}`).ReplaceAllString(output, " ")

在此处查看有关匹配空格的更多信息:How to remove redundant spaces/whitespace from a string in Golang?

最后,您可以在github.com/grokify/gotilla/html/htmlutil

中将以上内容组合为一个函数
var bluemondayStrictPolicy = bluemonday.StrictPolicy()

func HTMLToTextCondensed(s string) string {
    return strings.Join(
        strings.Fields(
            strings.TrimSpace(
                html.UnescapeString(
                    bluemondayStrictPolicy.Sanitize(s),
                ),
            )),
        " ",
    )
}