go 如何将【域名】是【商户账户全称</span><span style=“;font-family:宋体;font-size:14px“>】 html标准化

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))
}

最佳实践建议

  1. 输入验证:在处理前验证HTML输入的有效性

  2. 白名单过滤:只允许特定的HTML标签和属性

  3. CSS标准化:统一处理样式属性

  4. 编码处理:确保字符编码一致(UTF-8)

  5. 错误恢复:对畸形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,保留了语义但移除了不规范的标签和样式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leijmdas

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值