答案是cocur/slugify:它才是官方稳定、多语言支持(含中文转拼音)、无框架依赖的PHP Slug生成库,需配合cocur/slugify-extra扩展及intl扩展才能正确处理中文。

PHP-Slug-Generator 并不是一个被 Packagist 官方收录的稳定库,直接 composer require 会失败——它大概率是你在某篇博客或旧项目里看到的“民间命名”,实际对应的是 cviebrock/eloquent-sluggable(Laravel 场景)或更通用的 cocur/slugify。
确认你要的其实是 cocur/slugify
绝大多数非 Laravel 项目需要的“生成 URL 友好别名”功能,真正可用、维护活跃、无框架依赖的库是 cocur/slugify。它支持多语言字符转换(如中文转拼音)、自定义分隔符、大小写控制等核心需求。
- 不依赖 Laravel 或任何 ORM,纯函数式调用,
new Slugify()即可开用 - 中文需额外装
cocur/slugify-extra扩展包才能转拼音(否则默认丢弃非 ASCII 字符) - 若只处理英文标题,基础版足够;含中文必须加 extra 包 + 配置
rulesets
安装与基础用法(含中文支持)
执行以下命令一次性装齐:
composer require cocur/slugify cocur/slugify-extra
然后在 PHP 文件中这样用:
立即学习“PHP免费学习笔记(深入)”;
$slugify = new \Cocur\Slugify\Slugify();
$slugify->addRuleSet('russian', new \Cocur\Slugify\RuleProvider\RussianRuleProvider());
// 中文支持需手动加载拼音规则(extra 包提供)
$slugify->addRuleSet('chinese', new \Cocur\Slugify\RuleProvider\ChineseRuleProvider());
echo $slugify->slugify('Hello 世界!How are you?', 'chinese'); // 输出:hello-shi-jie-how-are-you
-
slugify()第二个参数指定 ruleset 名,必须和addRuleSet()注册时一致 - 不传第二个参数时,默认使用内置 ASCII 规则,中文会变成空字符串或下划线
- 注意
ChineseRuleProvider依赖ext-intl,没开启该扩展会抛出RuntimeException
常见报错及绕过方式
运行时报 Class 'Cocur\Slugify\RuleProvider\ChineseRuleProvider' not found?不是 Composer 没装好,而是你漏了 use 声明或 autoloader 未刷新:
- 确认文件顶部有
use Cocur\Slugify\Slugify;和use Cocur\Slugify\RuleProvider\ChineseRuleProvider; - 删掉
vendor/autoload.php重生成:运行composer dump-autoload - 若仍报错,检查
vendor/cocur/slugify-extra/src/RuleProvider/下是否存在ChineseRuleProvider.php——有些旧版本 composer install 会跳过 extra 包的 src 目录
另一个高频问题是中文转成乱码或问号,本质是输入字符串编码不是 UTF-8。务必确保传入 slugify() 的标题是 UTF-8 编码,否则先用 mb_convert_encoding($title, 'UTF-8', 'auto') 做兜底。
别名生成时容易被忽略的细节
生成别名不是“输进去、吐出来”就完事。真实业务中这几个点常被跳过,导致线上出问题:
- 数据库唯一性冲突:同一标题反复生成可能得到相同 slug,插入前必须查重并追加数字后缀(如
article-title-2) - 保留关键词:比如文章标题含 “vs”、“&”、“in” 等词,直接 slugify 会变成连字符或丢弃,可通过
addRules()手动映射(如['vs' => 'vs']) - 长度截断要放在 slugify 之后:先生成完整 slug,再用
substr()截,不能先截原文再转——否则可能切在中文中间导致乱码 - Laravel 用户慎用
eloquent-sluggable:它自动监听模型事件生成 slug,但对批量导入、API 接口等非 save 场景不触发,容易遗漏
真正稳定的 slug 生成,从来不是靠一个库自动搞定,而是把 cocur/slugify 当作基础工具,再套一层业务逻辑做去重、截断、预留词保护。



















