Slugify字符串工具

把任意标题、文件名或一段文字转成 URL 安全的 ASCII 短链接(slug):统一小写,用 NFD 拆出并去掉变音符,把任何非字母数字连续串压成单个连字符并去掉首尾连字符,中文等字符会被剔除以保留纯 ASCII。默认示例「Hello World! Café」会变成 hello-world-cafe。

默认已填示例;清空后想恢复,点「载入示例」。转换在本地实时完成。
转换结果(URL 安全 slug):

提示:文本框是多行输入,按 Ctrl/Cmd + Enter 触发转换;也可边输入边看结果区。结果区用 role="alert" 标出,方便读屏软件播报。

常见输入与输出对照(同一套算法实算)

输入输出 slug

本表每个输出都由本页同一套 slugify 算法实算,没有写死;它既是速查,也证明算法对各类输入的确定性行为。

使用方法

  1. 在文本框粘贴或输入内容(默认已填 Hello World! Café)。
  2. 点「转换」或按 Ctrl/Cmd + Enter,也可边输入边看结果区实时变化。
  3. 结果区给出 URL 安全的 slug:小写、去变音、非字母数字变单连字符、首尾连字符去掉。
  4. 点「复制结果」把 slug 存到剪贴板;「导出对照表 CSV」把 14 行输入/输出下载成带 BOM 的表格,Excel 不乱码。
  5. 点「载入示例」恢复默认文本并重算。

能解决什么问题

一是把任意标题变成可用的网址片段。博客、商品、文档的标题常带空格、大小写、标点、重音(如「Café」「Über」),直接塞进 URL 会乱码或被拦截。Slugify字符串工具把它们规整成纯小写 ASCII 连字符串,正好做路径或文件名。

二是跨语言去重音,统一形态。「Café」「CAFÉ」「café」本是一个词,但字节不同。本页先小写、再 NFD 拆掉重音,三者都收敛成「cafe」,避免同一文章因写法不同生成不同 slug。

三是剔除中文等方块字,保住 ASCII 链接。URL 路径里直接放中文虽被浏览器编码成一串 % 序列,但并不好看也不利于 SEO/分享。本页把非 ASCII 字符整段剔除,只留英文数字,得到干净短链。

本页不做这些事:不翻译、不做拼音转写(「中文」不会变「zhongwen」,而是被剔除)、不保证全局唯一(需后端查重)。它只回答「这段文本对应的 ASCII slug 长什么样」。

生成原理与变量说明

第一步:转小写。统一大小写,让「Hello」与「hello」等价,结果永远是纯小写。

第二步:NFD 归一化并去变音符。用 string.normalize('NFD') 把字符拆成「基字符 + 组合变音符号」,例如 é 变成 e + ◌́;再用正则 /[\u0300-\u036f]/g 把 U+0300–U+036F 这段组合记号整体删掉,重音就没了。这样「Café」→「Cafe」、「Über」→「Uber」。

第三步:非字母数字压成单连字符。用 /[^a-z0-9]+/g 把任意连续的非小写字母数字(空格、标点、中文、emoji 的每一半)替换成一个连字符,而不是每个字符一个,避免出现「a--b」这种双杠。

第四步:去首尾连字符。用 /^-+|-+$/g 把开头或结尾多余的连字符削掉,保证 slug 不以杠起止。

为什么中文被剔除。中文不在 [a-z0-9] 里,于是在第三步被并入连字符、又可能在第四步被削掉,最终不出现在输出中。这正是「保留 ASCII slug」的预期,而非遗漏。

数值只在本地计算。整条链路只有字符串小写、归一化、正则替换,全部在当前页面执行,没有任何网络请求,也不写 Cookie 或 localStorage。

完整示例(默认输入实测)

示例条件与页面默认值完全一致:输入 Hello World! Café。逐项核对:

换一组也能手算:输入「中文测试ABC」→ 小写不变 → 中文不在字母数字集 → 被压成连字符并削首尾 → 剩下 abc;输入「Über Öl」→ 「uber-ol」。都在对照表里有对应行。

对照表

对照表是「算法行为证明」而非「你的输入结果」,它与上方转换区是两个独立信息源:转换区给你这段具体文本的 slug,对照表给你各类输入的确定输出。

结果边界与舍入说明

常见问题

为什么中文直接消失了?

因为本页目标是「URL 安全的 ASCII slug」,而中文不在 a-z0-9 之内。第三步把中文这类非字母数字连续串压成一个连字符,第四步又把首尾连字符削掉,于是中文整体不出现在结果里。如果你希望中文保留,需要先做拼音转写再 slugify。

Café 的重音为什么没了?

这是预期的。第二步用 NFD 把 é 拆成 e + 组合重音符号,再用 /[\u0300-\u036f]/g 把那段组合记号删掉,于是「Café」收敛成「Cafe」。好处是「Café」「CAFÉ」「café」三种写法都得到同一个 slug,便于去重。

为什么有时候出现两个连字符?

正常不会。第三步用的是「+/g」把连续的非字母数字整段替换成一个连字符,所以「a ! ! b」只会得到「a-b」。若你看到双杠,多半是输入里夹了被保留的字符(如点号),请检查原始输入。

slug 能保证全球唯一吗?

不能。本工具只做形态清洗,不去重。「文章一」「文章二」都变空串,两篇名为「Hello」的文章都变「hello」。真正上线要在后端用 slug 查库、冲突时加序号(hello-2)来解决。

支持 Emoji 吗?

会把 Emoji 当作非字母数字处理,压成连字符后通常消失(如「emoji 🚀 launch」→「emoji-launch」)。本页不保留 Emoji 到 slug,因为目标就是纯 ASCII 短链接。

Über 这种德文变音怎么处理?

和法文重音一样走 NFD:Ü 拆成 U + 组合分音符,去变音符后变成 U,所以「Über」→「uber」。Ñ、Ø 等带圈/带波浪的字母同理会被规整到其基础拉丁字母。

对照表后两行为什么折叠?

前 12 行直接显示,第 13、14 行默认折叠,点「加载更多(还有 2 行)」即可展开;同时可「导出对照表 CSV」或「复制对照表」拿到全部 14 行 TSV。

结果会被上传或保存吗?

不会。所有转换只在你当前浏览器里完成,页面不发起任何网络请求,也不写 Cookie 或 localStorage。你在开发者工具的 Network 面板里连点几次「转换」,面板始终是空的。

相关工具