使用方法
- 在文本框粘贴或输入内容(默认已填 Hello World! Café)。
- 点「转换」或按 Ctrl/Cmd + Enter,也可边输入边看结果区实时变化。
- 结果区给出 URL 安全的 slug:小写、去变音、非字母数字变单连字符、首尾连字符去掉。
- 点「复制结果」把 slug 存到剪贴板;「导出对照表 CSV」把 14 行输入/输出下载成带 BOM 的表格,Excel 不乱码。
- 点「载入示例」恢复默认文本并重算。
能解决什么问题
一是把任意标题变成可用的网址片段。博客、商品、文档的标题常带空格、大小写、标点、重音(如「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é。逐项核对:
- 转小写:
hello world! café; - NFD + 去变音符:
café→cafe(é 的重音被拆掉),得到hello world! cafe; - 非字母数字压成单连字符:空格与感叹号那串 → 一个
-,得到hello-world-cafe; - 去首尾连字符:本例首尾无杠,结果不变,最终 hello-world-cafe;
- 交叉验证:对照表里「Hello World! Café」一行输出正是
hello-world-cafe,算法同构。
换一组也能手算:输入「中文测试ABC」→ 小写不变 → 中文不在字母数字集 → 被压成连字符并削首尾 → 剩下 abc;输入「Über Öl」→ 「uber-ol」。都在对照表里有对应行。
对照表
- 对照表用途:列出 14 种典型输入与其 slug 输出,覆盖重音、标点、中文、Cyrillic、emoji、数字等情形,证明算法行为确定。
- 行数:共 14 行,前 12 行直接显示,后 2 行点「加载更多」展开,可导出 CSV 或复制 TSV。
- 算法一致:表中每个输出都调用本页的 slugify 函数实算,和「转换」按钮走同一代码,没有任何特例。
- 读表方式:左列是原始输入(含特殊字符),右列是清洗后的 ASCII slug,可照着验证你自己的理解。
对照表是「算法行为证明」而非「你的输入结果」,它与上方转换区是两个独立信息源:转换区给你这段具体文本的 slug,对照表给你各类输入的确定输出。
结果边界与舍入说明
- 空输入得到空 slug。若你清空文本框,输出是空串(连字符也被首尾规则削光),这是正确行为,不会报错。
- 全中文/全符号输入会被清空。「你好!」整段都不在 [a-z0-9],压成杠后被削掉,结果为空。若想得到非空 slug,请混入英文或数字。
- emoji 被拆成两个连字符再合并。emoji 多以代理对存储,每半被当非字母数字,第三步把它们压成单杠;如「emoji 🚀 launch」→「emoji-launch」,行为确定。
- 不保证唯一性。slugify 只做形态清洗,不查数据库去重。「文章一」和「文章二」都变成空串、或两篇「Hello」都变成「hello」,需后端另行判重。
- 不做拼音转写。「北京」不会变成「beijing」而是被剔除。若需要中文转拼音 slug,请先做拼音转换再喂给本工具。
- 数值只在本地计算。整条链路只有字符串处理,全部在当前页面执行,没有网络请求,也不写 Cookie 或 localStorage,关掉页面即清空。
常见问题
为什么中文直接消失了?
因为本页目标是「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 面板里连点几次「转换」,面板始终是空的。