使用方法
URL别名生成器把「人写的标题」翻成「机器和搜索引擎喜欢的短标识」,一行一条批量处理,按下面的步骤操作:
- 在左侧文本框粘贴标题,一行一条,示例 4 行(从 Café Crème Déjà Vu 到「中文标题 Hello World 2026」)。
- 选分隔符,示例连字符「-」;下划线「_」多用于代码标识,URL 里并不推荐。
- 设最大长度,示例 60;超过就按分隔符边界截断,避免出现半个单词。
- 选非 ASCII 处理方式,示例「丢弃」;中文要保留可改成「百分号编码」。
- 点「生成 URL 别名」,或按 Ctrl/Cmd+回车;右侧立即给出 slug,每行对应一行原文。
这个 URL别名生成器能解决什么问题
手写 slug 最容易出三件事:音调符号没去掉导致链接里出现 caf%C3%A9、连续空格产生了 my---blog 这样的多个连字符、以及中文标题整段被塞进 URL 变得又长又乱。URL别名生成器把这三步一次做对。
场景一,博客迁移:把 200 篇旧标题批量贴进来,一次导出 200 条 slug,省掉逐条手改。示例「How to Bake Sourdough Bread」→ how-to-bake-sourdough-bread。
场景二,多语言站点:法语西语的标题先去掉音调,Café Crème Déjà Vu → cafe-creme-deja-vu,链接可读且不会出现百分号乱码。
场景三,中文站分级 URL:中文标题先转拼音再拼 slug 是最佳实践,本页可先输出丢弃中文的骨架(hello-world-2026),拼音部分交给专门的转换工具补上。
本页不做的事:不内置汉字转拼音词典(见相关工具);不检查 slug 是否已被占用或是否命中保留字;不改写站内已有链接。
原理与规则说明
URL别名生成器的核心是一条正则流水线,对每行依次执行:s.normalize('NFD') 把带音调的字符拆成「基础字母 + 组合符」;.replace(/[\u0300-\u036f]/g, '') 删掉组合符;.toLowerCase() 统一小写;.replace(/[^a-z0-9]+/g, sep) 把所有非字母数字的连续片段压成一个分隔符;最后用 replace(/^-+|-+$/g, '') 去掉首尾多余的分隔符。
为什么先 normalize('NFD') 再删组合符:é 在 Unicode 里既可以是一个码点 U+00E9,也可以拆成 U+0065(e)+ U+0301(´)。NFD 统一拆开后再按 U+0300~U+036F 区间删除,就能同时处理「预组合」和「已分解」两种写法。示例中 "Café Crème Déjà Vu" 经 NFD 后长度从 16 涨到 22,多出来的就是被删掉的 6 个组合符。
分隔符用连字符而不是下划线:- 在 RFC 3986 的 unreserved 集合内(该集合共 66 个字符:A-Z、a-z、0-9、- . _ ~),且在中文与英文语境下都被视作「词的分界」;下划线会被部分「下划线分词」的场合忽略,反而把两个词粘成一个。Google 也建议 URL 用连字符分词。
中文的三种取舍:丢弃 输出最短、兼容性最好,但会丢掉语义;保留并百分号编码 用 encodeURIComponent 把每个汉字编成 3 组 %XX——一个汉字占 9 个字符,"中文标题" 编码后是 %E4%B8%AD%E6%96%87%E6%A0%87%E9%A2%98 共 36 个字符;原样保留 严格说不符合 RFC 3986(URL 只能由 ASCII 组成),需要浏览器按 RFC 3987 的 IRI 规则兜底显示,跨系统传输容易出问题。
长度为什么默认 60:搜索引擎展示 URL 时通常在 60~75 个字符处截断,超出部分用户在结果页看不到。截断时按分隔符边界回退,宁可少一个词也不产生半截单词——示例长标题 96 字符截到 60 后回退成 this-is-a-very-long-article-title-that-should-be-truncated(57 字符)。
完整示例(数值仅作演示)
示例条件:分隔符连字符、最长 60、非 ASCII 丢弃;原文 4 行。数值仅作演示。
Café Crème Déjà Vu→cafe-creme-deja-vu(18 字符,音调被删除)。Über Straße Zürich 2026→uber-stra-e-zurich-2026(24 字符;ß 不在删除范围内,被替换成了分隔符,形成stra-e)。--- Hello World ---→hello-world(11 字符,多个空格与连字符合并成一个)。中文标题 Hello World 2026→hello-world-2026(16 字符,中文按丢弃处理)。
三处咬合:控件默认值(分隔符 -、最长 60、丢弃)、本节 4 条结果、对照表第 1~4 行逐字一致。
输入范围与对照表
| 字段 | 范围 | 默认 | 边界含义 |
|---|---|---|---|
| 分隔符 | - 或 _ | - | 连字符在 RFC 3986 unreserved 集合内,推荐 |
| 最大长度 | 20~120 | 60 | 小于 20 会把多数标题截成 1~2 个词,失去语义 |
| 非 ASCII | 丢弃 / 编码 / 保留 | 丢弃 | 编码模式下 1 个汉字占 9 字符,最长要相应放宽 |
常见转换对照:10 Tips & Tricks for SEO! → 10-tips-tricks-for-seo(去标点);My Blog Post → my-blog-post(合并空格);UPPERCASE TITLE HERE → uppercase-title-here(转小写);ΑΘΉΝΑ Acropolis → acropolis(希腊字母整体丢弃,NFD 不去掉它们)。
输入范围、边界与精度说明
NFD 能处理的范围:拉丁字母(带重音、变音记号)、希腊字母的分解形式等,凡是有「基础字符 + 组合符」拆法的都能去音调。但 ß(德语 sharp s)、æ、ø、đ、ł 这些没有分解形式的字符不在 U+0300~U+036F 区间内,会被丢弃模式当成非字母而替换成分隔符——这就是 Straße 变成 stra-e 的原因。
截断精度:长度上限按 UTF-16 码元计。纯 ASCII slug 里 1 字符 = 1 码元;若选「百分号编码」模式,输出仍是 ASCII,长度可直接用。截断始终发生在分隔符边界,不会把 -%E4%B8 这类三连编码切一半。
边界一:某行全是非 ASCII 且模式为「丢弃」时,该行 slug 为空——本质是该行没有可用字符,页面按行给出提示而不是静默吞掉。
边界二:首尾标点、纯数字、单个字符都能正确处理;--- Hello World --- 的首尾连字符会被去掉,不会留下 -hello-world-。
常见误用的正确解释:一,slug 不是越小写越好,而是「小写 + 连字符 + 无音调 + 无连续分隔符」四条同时满足;二,slug 里出现大写不会报错,但大小写会被部分服务器视为两个不同地址,统一小写才保险;三,_ 和 - 不能混用,同一个站里混用会让词边界判定不一致。
常见问题
slug 是什么,和 URL 有什么区别?
slug 是 URL 路径里那段「可读的短标识」,比如 /blog/how-to-bake-bread/ 最后一段。它属于 URL 的一部分,但只负责可读性与分词,不参与域名与协议。
中文到底该保留还是丢弃?
面向中文用户且链接会分享到中文平台时,保留原文(百分号编码)更利于识别;面向多语言或要求短链接时,先转拼音再拼 slug 最稳。本页「丢弃」只是最通用的骨架。
为什么 Straße 变成了 stra-e?
因为 ß 没有 Unicode 分解形式,normalize('NFD') 拆不出「s + 组合符」,它直接落在非字母数字集合里被替换成分隔符。德语站点需把 ß 先手工替换成 ss 再转换。
最多能处理多少行?
本页按行处理,单次建议 500 行以内(约 3 万字符)。超长文本浏览器仍能算完,但实时更新的开销会上去,建议改为点「生成」按钮再算。
连续空格为什么只留一个连字符?
正则是 [^a-z0-9]+,后面的 + 表示「一个或多个」,所以整段连续的非字母数字只会被替换成单个分隔符,不会产生 my---blog。
生成的 slug 会和已有页面冲突吗?
本页只做字符串转换,不查重。落地前请对照现有路由与保留字(如 new、edit、list、index、admin、api、login、search)检查,冲突时在末尾补一个数字或语义词。
能直接粘到 Excel 里做批量吗?
能。结果区一行一条,可直接整列粘贴;「导出对照 CSV」给的是「原文 + slug + 长度」三列,带 BOM,Excel 打开中文不乱码。
为什么要限制最小 20 字符?
20 是防呆下限:绝大多数标题截到 20 字符只剩 2~3 个词,语义已经丢失。真要超短 slug,建议手工起名而不是让工具截断。
相关工具
- 汉字转拼音:把中文标题转成拼音,再拼进 slug 的推荐组合。
- URL编码:查看任意字符串的百分号编码结果。
- URL解码:把已经百分号编码的链接还原成可读文本。
- URL别名校验:检查一条 slug 是否合法、是否命中保留字。
- 域名生成器:为整站挑选可用域名与品牌词。
- Base64URL编码解码:另一种 URL 安全编码,常用于 token 而非路径。
更多实用工具见分类页。