golang实现多语言支持的URL友好字符串转换插件slug的使用
Golang实现多语言支持的URL友好字符串转换插件slug的使用
介绍
slug
包可以从Unicode字符串生成URL友好的slug,支持多种语言。它能够将各种语言的字符串转换为仅包含ASCII字符的URL友好格式。
安装
go get -u github.com/gosimple/slug
示例代码
package main
import (
"fmt"
"github.com/gosimple/slug"
)
func main() {
// 基本用法
text := slug.Make("Hellö Wörld хелло ворлд")
fmt.Println(text) // 输出: "hello-world-khello-vorld"
// 中文转换
someText := slug.Make("影師")
fmt.Println(someText) // 输出: "ying-shi"
// 指定语言(英语)
enText := slug.MakeLang("This & that", "en")
fmt.Println(enText) // 输出: "this-and-that"
// 指定语言(德语)
deText := slug.MakeLang("Diese & Dass", "de")
fmt.Println(deText) // 输出: "diese-und-dass"
// 保留大写字符
slug.Lowercase = false // 保持大写字符
deUppercaseText := slug.MakeLang("Diese & Dass", "de")
fmt.Println(deUppercaseText) // 输出: "Diese-und-Dass"
// 自定义替换规则
slug.CustomSub = map[string]string{
"water": "sand",
}
textSub := slug.Make("water is hot")
fmt.Println(textSub) // 输出: "sand-is-hot"
}
设计特点
这个库总是会从任何Unicode字符串返回干净的输出,只包含以下ASCII字符:
- 数字:
0-9
- 小写字母:
a-z
- 大写字母:
A-Z
(仅在设置Lowercase
为false
时保留) - 减号:
-
- 下划线:
_
减号和下划线字符永远不会出现在返回字符串的开头或结尾。
得益于Unicode字符到ASCII的无上下文音译,返回的字符串对于URL slug和文件名是安全的。
请求或报告问题
如果你的语言缺失,你可以将其添加到languages_substitution.go
文件中。
如果缺少适当的Unicode字符音译到ASCII,你可以将它们添加到基础库中。
基准测试
go test -run=NONE -bench=. -benchmem -count=6 ./... > old.txt
# 做一些修改
go test -run=NONE -bench=. -benchmem -count=6 ./... > new.txt
go install golang.org/x/perf/cmd/benchstat@latest
benchstat old.txt new.txt
许可证
源代码文件根据Mozilla Public License, version 2.0分发,除非另有说明。
更多关于golang实现多语言支持的URL友好字符串转换插件slug的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang实现多语言支持的URL友好字符串转换插件slug的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang 实现多语言支持的 URL 友好字符串转换(Slug)
Slug 是将字符串转换为 URL 友好的格式的过程,通常用于创建 SEO 友好的 URL。在 Go 中,我们可以使用 github.com/gosimple/slug
包来实现多语言支持的 Slug 转换。
安装
首先安装 slug 包:
go get -u github.com/gosimple/slug
基本用法
package main
import (
"fmt"
"github.com/gosimple/slug"
)
func main() {
// 基本转换
text := "Hello World! 这是一个测试"
slugText := slug.Make(text)
fmt.Println(slugText) // 输出: hello-world-这是一个测试
// 自定义分隔符
slug.CustomSub = '_'
slugText = slug.Make(text)
fmt.Println(slugText) // 输出: hello_world_这是一个测试
// 还原默认分隔符
slug.CustomSub = '-'
// 转换为小写(默认)
slug.Lowercase = true
slugText = slug.Make("GoLang IS Awesome")
fmt.Println(slugText) // 输出: golang-is-awesome
// 禁用小写转换
slug.Lowercase = false
slugText = slug.Make("GoLang IS Awesome")
fmt.Println(slugText) // 输出: GoLang-IS-Awesome
}
多语言支持
slug 包内置了对多种语言的特殊字符处理:
func main() {
// 德语
germanText := "Äpfel und Birnen"
germanSlug := slug.MakeLang(germanText, "de")
fmt.Println(germanSlug) // 输出: aepfel-und-birnen
// 希腊语
greekText := "Γειά σου Κόσμε"
greekSlug := slug.MakeLang(greekText, "el")
fmt.Println(greekSlug) // 输出: geia-sou-kosme
// 中文
chineseText := "你好,世界!"
chineseSlug := slug.MakeLang(chineseText, "zh")
fmt.Println(chineseSlug) // 输出: 你好世界
// 俄语
russianText := "Привет, мир!"
russianSlug := slug.MakeLang(russianText, "ru")
fmt.Println(russianSlug) // 输出: privet-mir
}
自定义替换规则
你可以自定义字符替换规则:
func main() {
// 添加自定义替换
slug.AddSub("♥", "love")
slug.AddSub("★", "star")
text := "I ♥ Go ★★★★★"
slugText := slug.Make(text)
fmt.Println(slugText) // 输出: i-love-go-starstarstarstarstar
}
完整示例
下面是一个完整的 Web 应用示例,展示如何从文章标题生成 slug:
package main
import (
"fmt"
"net/http"
"html/template"
"github.com/gosimple/slug"
)
type Article struct {
Title string
Slug string
}
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
if r.Method == "GET" {
tmpl := template.Must(template.ParseFiles("form.html"))
tmpl.Execute(w, nil)
} else if r.Method == "POST" {
r.ParseForm()
title := r.Form.Get("title")
lang := r.Form.Get("lang")
article := Article{
Title: title,
Slug: slug.MakeLang(title, lang),
}
tmpl := template.Must(template.ParseFiles("result.html"))
tmpl.Execute(w, article)
}
})
fmt.Println("Server running on :8080")
http.ListenAndServe(":8080", nil)
}
form.html:
<form method="POST">
<label>文章标题: <input type="text" name="title"></label><br>
<label>语言:
<select name="lang">
<option value="en">English</option>
<option value="zh">中文</option>
<option value="de">Deutsch</option>
<option value="fr">Français</option>
</select>
</label><br>
<button type="submit">生成 Slug</button>
</form>
result.html:
<h1>生成的 Slug</h1>
<p>标题: {{.Title}}</p>
<p>Slug: {{.Slug}}</p>
<a href="/">返回</a>
注意事项
-
默认情况下,slug 会:
- 转换为小写
- 用连字符
-
替换空格和特殊字符 - 移除标点符号
- 保留多语言字符(如中文)
-
对于性能敏感的应用,可以考虑缓存 slug 结果,避免重复计算。
-
如果需要更复杂的转换规则,可以 fork 该库并进行自定义修改。
这个 slug 库支持 50 多种语言的字符转换,非常适合需要国际化支持的 Web 应用。