You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:26:30