Go 语言实现 HTML 标准化处理
要将 【域名】是【商户账户全称</span><span style=";font-family:宋体;font-size:14px">】
这样的非标准 HTML 标准化,可以使用以下几种方法:
方法 1: 使用正则表达式修复
go
复制
下载
package main import ( "fmt" "regexp" ) func main() { html := `【域名】是【商户账户全称</span><span style=";font-family:宋体;font-size:14px">】` // 修复未闭合的标签和多余的span re := regexp.MustCompile(`【([^】]+)</span><span[^>]*>】`) standardHTML := re.ReplaceAllString(html, "【$1】") fmt.Println(standardHTML) }
输出:
复制
下载
【域名】是【商户账户全称】
方法 2: 使用 goquery 进行 DOM 操作
go
复制
下载
package main import ( "fmt" "strings" "github.com/PuerkitoBio/goquery" ) func main() { html := `【域名】是【商户账户全称</span><span style=";font-family:宋体;font-size:14px">】` doc, err := goquery.NewDocumentFromReader(strings.NewReader(html)) if err != nil { panic(err) } // 查找并修复不规范的span标签 doc.Find("span").Each(func(i int, s *goquery.Selection) { if strings.Contains(s.Text(), "】") { // 获取span内的文本并移除span标签 text := s.Text() s.ReplaceWithHtml(text) } }) standardHTML, _ := doc.Html() fmt.Println(standardHTML) }
方法 3: 使用标准库 html/template 进行安全渲染
go
复制
下载
package main import ( "html/template" "os" ) func main() { tmpl := template.Must(template.New("standard").Parse(` {{define "merchant"}}【商户账户全称】{{end}} 【域名】是{{template "merchant"}} `)) data := struct{}{} tmpl.Execute(os.Stdout, data) }
方法 4: 完整 HTML 标准化处理
go
复制
下载
package main import ( "fmt" "golang.org/x/net/html" "strings" ) func normalizeHTML(input string) string { doc, err := html.Parse(strings.NewReader(input)) if err != nil { return input } var b strings.Builder var f func(*html.Node) f = func(n *html.Node) { switch n.Type { case html.TextNode: b.WriteString(n.Data) case html.ElementNode: // 只保留必要的标签 if n.Data == "span" { for c := n.FirstChild; c != nil; c = c.NextSibling { f(c) } } } } for c := doc.FirstChild; c != nil; c = c.NextSibling { f(c) } return b.String() } func main() { html := `【域名】是【商户账户全称</span><span style=";font-family:宋体;font-size:14px">】` fmt.Println(normalizeHTML(html)) }
最佳实践建议
-
输入验证:在处理前验证HTML输入的有效性
-
白名单过滤:只允许特定的HTML标签和属性
-
CSS标准化:统一处理样式属性
-
编码处理:确保字符编码一致(UTF-8)
-
错误恢复:对畸形HTML有容错处理
完整标准化处理示例
go
复制
下载
package main import ( "fmt" "regexp" "strings" ) func StandardizeHTML(input string) string { // 1. 修复未闭合的中括号 re := regexp.MustCompile(`【([^】]*)<[^>]+>】`) input = re.ReplaceAllString(input, "【$1】") // 2. 移除多余的HTML标签但保留内容 re = regexp.MustCompile(`<[^>]+>`) input = re.ReplaceAllString(input, "") // 3. 标准化中括号格式 input = strings.ReplaceAll(input, "【", "<span class='bracket'>【</span>") input = strings.ReplaceAll(input, "】", "<span class='bracket'>】</span>") return input } func main() { html := `【域名】是【商户账户全称</span><span style=";font-family:宋体;font-size:14px">】` fmt.Println(StandardizeHTML(html)) }
输出结果将是标准化的HTML,保留了语义但移除了不规范的标签和样式。