PHP中使用str_slug生成slug时如何保留大写字母?
实现保留原大写字母的Slug生成方法
嘿,这个需求我刚好碰到过!默认的str_slug()(尤其是Laravel里的实现)确实会把所有字符强制转成小写,但要保留原有的大写格式其实不难,给你两种实用的解决方案:
方法一:自定义专属的Slug生成函数
直接写一个简单的函数,核心逻辑是只处理分隔符,不修改字符的大小写:
function custom_str_slug($title, $separator = '-') { // 把所有非字母数字的字符替换成分隔符 $slug = preg_replace('/[^a-zA-Z0-9]+/', $separator, $title); // 移除字符串首尾的分隔符 $slug = trim($slug, $separator); // 把连续的多个分隔符替换成单个 $slug = preg_replace('/' . preg_quote($separator, '/') . '+/', $separator, $slug); return $slug; } // 测试示例 echo custom_str_slug('Hello --- World'); // 输出: Hello-World echo custom_str_slug('My Awesome Title!'); // 输出: My-Awesome-Title
如果需要支持Unicode多语言字符(比如中文、俄语等),可以把正则改成/[^a-zA-Z0-9\p{L}]+/u,这样不会过滤掉其他语言的字母;要是想保留下划线,调整正则为/[^a-zA-Z0-9_]+/即可。
方法二:基于Laravel的Str类改造(如果你用Laravel)
如果你是在Laravel项目里,可以利用Str类的链式操作,跳过默认的转小写步骤:
use Illuminate\Support\Str; $originalText = 'Hello --- World'; $slug = Str::of($originalText) ->replaceMatches('/[^a-zA-Z0-9]+/', '-') // 替换特殊字符为连字符 ->trim('-') // 清理首尾的连字符 ->replaceMatches('/-+/', '-'); // 合并连续的连字符 echo $slug; // 输出: Hello-World
这个方法的好处是复用Laravel的字符串处理能力,同时完全保留原有的大小写结构。
最后提个小注意:保留大写的slug在URL里是区分大小写的(取决于服务器配置),如果你的业务之前依赖全小写slug的兼容性,替换方案后要确认业务逻辑能适配这一点哦!
内容的提问来源于stack exchange,提问作者Sagynbek Kenzhebaev
相关产品推荐
相关产品推荐

