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 (仅在设置Lowercasefalse时保留)
  • 减号: -
  • 下划线: _

减号和下划线字符永远不会出现在返回字符串的开头或结尾。

得益于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

1 回复

更多关于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>

注意事项

  1. 默认情况下,slug 会:

    • 转换为小写
    • 用连字符 - 替换空格和特殊字符
    • 移除标点符号
    • 保留多语言字符(如中文)
  2. 对于性能敏感的应用,可以考虑缓存 slug 结果,避免重复计算。

  3. 如果需要更复杂的转换规则,可以 fork 该库并进行自定义修改。

这个 slug 库支持 50 多种语言的字符转换,非常适合需要国际化支持的 Web 应用。

回到顶部