Slug 生成器

将任意文本转换为简洁的 URL 友好型 Slug

加载示例
分隔符

输入文本

Slug

本地运行 · 粘贴密钥安全无忧
Slug 将在此处显示…

什么是 URL Slug?

URL Slug 是网址中用于以人类可读形式标识特定页面的部分。在 URL https://example.com/blog/my-first-post 中,Slug 即为 my-first-post。Slug 生成器将页面标题或描述转换为只包含小写字母、数字和连字符(或其他选定分隔符)的字符串。这一过程会移除空格、去除重音符号和变音标记、删除特殊字符,并将连续空白压缩为单个分隔符。

Slug 生成是内容管理系统、静态站点生成器、博客平台以及任何从用户输入衍生 URL 的应用程序的标准步骤。WordPress、Ghost、Hugo、Next.js 和 Django 均内置了 Slug 生成逻辑,因为可读的 URL 既能提升可用性,也有助于搜索引擎优化。一个格式规范的 Slug 能让用户在点击链接之前就了解页面内容。

"slug" 一词来源于报纸出版业,指在生产流程中用于标识稿件的简短标签。在 Web 开发中,Slug 承担着相同的功能:它是从较长标题或名称派生出的紧凑、唯一、URL 安全的标识符。由于 Slug 是通过程序化方式生成的,可靠的 Slug 生成器能确保每个页面和每种语言版本的一致性。

为什么使用这个 Slug 生成器?

手动创建 URL Slug 容易出错。忘记去除重音符号、留下双连字符,或未能处理 Unicode 输入的边界情况,都会产生损坏或难看的 URL。本工具自动处理这些问题。

即时转换
粘贴或输入任意文本,Slug 实时更新。无需提交表单,无需刷新页面。需要为一批文章标题或产品名称批量生成 Slug 时非常实用。
🔒
隐私优先处理
所有 Slug 生成均在浏览器中完成。文本不会离开页面,因此可以安全地转换草稿标题、内部项目名称或未发布的产品名称。
⚙️
可配置输出
可选择连字符、下划线或点号作为分隔符,并切换是否转换为小写。这涵盖了不同框架和内容管理系统中最常见的 Slug 规范。
🌐
Unicode 与重音处理
生成器应用 NFD 规范化来去除重音字符上的变音标记。Café 变为 cafe,naïve 变为 naive。无法音译的非拉丁字符将被干净地移除。

Slug 生成器使用场景

前端开发者 — 路由规划
在接入动态路由段之前,为 React Router、Next.js 或 Nuxt 中的页面路由生成统一的 Slug。验证包含特殊字符的标题是否能生成干净的路径。
后端工程师 — 数据库标识符
为需要人类可读标识符的数据库记录创建 URL 安全的 Slug。Slug 可作为辅助键与数字 ID 配合使用,适用于 /api/products/wireless-headphones 等 REST API 端点。
DevOps — 配置文件命名
将服务名称或环境标签转换为文件系统安全的字符串,用于配置文件、Docker 镜像标签或不允许特殊字符的 Kubernetes 资源名称。
QA 工程师 — 测试数据生成
快速从测试用例标题生成 Slug 变体,以验证跨多个测试环境的 URL 路由、重定向规则和规范标签行为。
数据工程师 — 列名规范化
将 CSV 或 Excel 导入中混乱的列标题规范化为统一的 snake_case 或 kebab-case 标识符,用于数据库模式或数据处理流水线。
学生 — 内容管理系统与博客项目
在使用 WordPress、Jekyll 或自定义内容管理系统构建博客时,了解 Slug 生成的工作原理。使用本工具将手动生成的 Slug 与参考实现进行对比。

Slug 生成规则与字符处理

Slug 生成遵循一系列可预测的转换步骤。理解每个步骤有助于调试意外输出,或自行构建 slugify 函数。

  1. 1. Unicode 规范化(NFD)
    将组合字符分解为基础字符加组合标记。例如,é(U+00E9)分解为 e 加组合锐音符(U+0301)。这使得变音标记可在下一步中被移除。
  2. 2. 去除变音标记
    移除 Unicode 组合变音标记块(U+0300–U+036F)中的所有字符。此步骤完成后,café 变为 cafe,Ñ 变为 N。
  3. 3. 移除特殊字符
    将所有非字母、非数字、非空白、非连字符的字符替换为空格。这会删除标点符号、符号以及没有 ASCII 对应形式的字符。
  4. 4. 修剪并压缩空白
    移除首尾空白,然后将连续的空格、下划线或连字符压缩为单个选定的分隔符。
  5. 5. 应用大小写与分隔符
    可选择转换为小写,并使用选定的分隔符连接各词:连字符(-)、下划线(_)或点号(.)。

字符转换参考表

下表展示了 Slug 生成过程中常见字符的处理方式:

输入输出应用规则
Hello Worldhello-worldLowercase + space → hyphen
Café au Laitcafe-au-laitNFD normalization strips é → e
naïve résuménaive-resumeMultiple diacritics removed
Price: $9.99!price-9-99Symbols ($, !, :) removed
too many too-manyWhitespace trimmed and collapsed
one--two___threeone-two-threeMixed separators collapsed
Привет мирprivet-mirCyrillic (if transliteration) or removed
file_name.txtfile-name-txtDots and underscores replaced
React & Vuereact-vueAmpersand removed
2026-03-302026-03-30Digits and hyphens preserved

代码示例

以下展示在常见编程语言和框架中生成 Slug 的方法。每个示例均处理 Unicode 规范化、变音标记移除和分隔符插入。

JavaScript
function slugify(text, separator = '-') {
  return text
    .normalize('NFD')                   // decompose accented chars
    .replace(/[\u0300-\u036f]/g, '')    // strip diacritics
    .toLowerCase()
    .replace(/[^\w\s-]/g, ' ')          // drop special chars
    .trim()
    .replace(/[\s_-]+/g, separator)     // collapse whitespace → separator

  // slugify('Café au Lait')      → "cafe-au-lait"
  // slugify('Hello World', '_')  → "hello_world"
}

// Node.js alternative using the `slugify` npm package:
// npm install slugify
// const slugify = require('slugify')
// slugify('Hello World', { lower: true, strict: true }) → "hello-world"
Python
import re
import unicodedata

def slugify(text: str, separator: str = '-') -> str:
    """Convert text to a URL-safe slug."""
    text = unicodedata.normalize('NFD', text)
    text = text.encode('ascii', 'ignore').decode('ascii')  # strip non-ASCII
    text = text.lower()
    text = re.sub(r'[^\w\s-]', ' ', text)
    text = text.strip()
    text = re.sub(r'[\s_-]+', separator, text)
    return text

# slugify('Café au Lait')      → "cafe-au-lait"
# slugify('Hello World', '_')  → "hello_world"

# Alternative: python-slugify (pip install python-slugify)
# from slugify import slugify
# slugify('Café au Lait')  → "cafe-au-lait"
Go
package main

import (
	"regexp"
	"strings"
	"unicode"

	"golang.org/x/text/unicode/norm"
	"golang.org/x/text/transform"
	"golang.org/x/text/runes"
)

func slugify(text string) string {
	// NFD normalize and strip diacritics
	t := transform.Chain(norm.NFD, runes.Remove(runes.In(unicode.Mn)), norm.NFC)
	result, _, _ := transform.String(t, text)

	result = strings.ToLower(result)
	re := regexp.MustCompile(`[^\w\s-]+`)
	result = re.ReplaceAllString(result, " ")
	result = strings.TrimSpace(result)
	re = regexp.MustCompile(`[\s_-]+`)
	result = re.ReplaceAllString(result, "-")
	return result
}

// slugify("Café au Lait") → "cafe-au-lait"
// slugify("Hello World")  → "hello-world"
PHP
function slugify(string $text, string $separator = '-'): string {
    // Transliterate non-ASCII characters
    $text = transliterator_transliterate(
        'Any-Latin; Latin-ASCII; Lower()', $text
    );
    // Remove anything that is not a word char, space, or hyphen
    $text = preg_replace('/[^\w\s-]/', ' ', $text);
    $text = trim($text);
    $text = preg_replace('/[\s_-]+/', $separator, $text);
    return $text;
}

// slugify('Café au Lait')      → "cafe-au-lait"
// slugify('Hello World', '_')  → "hello_world"

常见问题

Slug 与 URL 路径有什么区别?
URL 路径是域名之后的完整段,例如 /blog/2026/my-post。Slug 是路径中标识特定资源的人类可读部分,通常是最后一段:my-post。Slug 通常从标题派生,而路径的其余部分则反映站点的路由结构。
Slug 生成如何处理中文或阿拉伯文等非拉丁文字?
使用 NFD 规范化和变音标记去除的标准 Slug 生成器无法对非拉丁文字进行音译。汉字或阿拉伯字母没有 ASCII 对应形式,因此会在特殊字符清理步骤中被移除。若要在 Slug 中保留非拉丁内容,需要使用音译库,例如 JavaScript 的 limax、带有 unidecode 后端的 python-slugify,或自定义映射表。
URL Slug 应使用连字符还是下划线?
Google 将连字符视为单词分隔符,而将下划线视为单词连接符。Slug my-first-post 被读作三个词(my、first、post),而 my_first_post 被读作一个词元。出于 SEO 目的,连字符是 URL Slug 的标准选择。下划线常用于文件名、数据库列名和编程标识符,在这些场景中它们充当变量安全的连接符。
URL Slug 应该多长?
Google 在搜索结果中显示约 60 个字符的 URL,超出部分会被截断。较短的 Slug 更易阅读、分享和输入。建议使用 3 到 6 个词。在不影响语义的情况下,删除虚词(the、a、an、and、or、in):how-to-build-nextjs-app 优于 how-to-build-a-next-js-app-in-2026。
Slug 生成与 URL 编码相同吗?
不同。URL 编码(百分号编码)将不安全字符替换为百分号三元组,例如将空格替换为 %20。Slug 生成则完全移除或替换不安全字符,生成不含任何编码痕迹的干净字符串。Slug 中不会出现百分号、空格或特殊字符。URL 编码保留原始内容;Slug 生成则将其转换为全新的形式。
两个不同的标题可能生成相同的 Slug 吗?
可以。仅在标点符号、重音符号或大小写上有差异的标题往往会生成相同的 Slug。例如,"简历技巧" 和 "简历技巧!" 可能产生相同结果。在内容管理系统或数据库场景中,需要进行唯一性检查,在发生冲突时追加数字后缀(resume-tips-2)。
如何在 WordPress 或 Django 中生成 Slug?
WordPress 通过 sanitize_title() 函数自动从文章标题生成 Slug,也可在文章编辑器中手动修改。Django 在 django.utils.text 中提供了 slugify() 函数,能较好地处理 ASCII 输入。如需支持 Unicode,请传入 allow_unicode=True。两个平台均将 Slug 与完整标题一同存储在数据库中。