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

如何对包含空格与连字符分隔的字符串实现单词首字母大写格式化

解决方案:同时支持空格和连字符分隔的单词首字母大写

你的问题在于现有代码仅通过空格分割字符串,导致连字符连接的片段被当成一个整体处理,没法单独对连字符两侧的内容做首字母大写。这里有两种靠谱的实现方式,都能完美解决你的需求:

方法一:用正则表达式批量处理(简洁高效)

利用preg_replace_callback可以匹配所有被空格/连字符分隔的字母片段,逐个处理后替换回去,连字符和空格会自动保留:

$string = "hello teSt woRld hEllo-woRld";
$formattedString = preg_replace_callback('/[\p{L}]+/u', function($matches) {
    // 先把整个片段转小写
    $lowerWord = mb_strtolower($matches[0], 'UTF-8');
    // 首字母大写,其余保持小写
    return mb_strtoupper(mb_substr($lowerWord, 0, 1, 'UTF-8'), 'UTF-8') 
           . mb_substr($lowerWord, 1, null, 'UTF-8');
}, $string);

echo $formattedString; // 输出:Hello Test World Hello-World

说明:

  • 正则/[\p{L}]+/u会匹配所有Unicode字母序列(支持多语言场景),自动跳过空格和连字符
  • 回调函数延续了你原本的mb_*多字节字符处理逻辑,确保非英文字符也能正确处理

方法二:分层分割处理(直观易扩展)

如果觉得正则不够直观,可以先按空格分割成大单词,再对每个大单词按连字符分割成小片段,处理后重新拼接:

$string = "hello teSt woRld hEllo-woRld";
$words = explode(" ", $string);
$new = '';

foreach ($words as $word) {
    // 把单个单词按连字符拆成小片段
    $parts = explode("-", $word);
    $processedParts = [];
    
    foreach ($parts as $part) {
        $lowerPart = mb_strtolower($part, 'UTF-8');
        $processedPart = mb_strtoupper(mb_substr($lowerPart, 0, 1, 'UTF-8'), 'UTF-8') 
                         . mb_substr($lowerPart, 1, null, 'UTF-8');
        $processedParts[] = $processedPart;
    }
    
    // 用连字符拼接处理后的小片段,再加上空格
    $new .= implode("-", $processedParts) . ' ';
}

// 移除最后多余的空格
$new = trim($new);
echo $new; // 输出:Hello Test World Hello-World

说明:

  • 这种方式逻辑清晰,后续如果要支持其他分隔符(比如下划线),只需要把explode("-", $word)改成preg_split('/[-_]/', $word)即可

两种方法都能实现你想要的效果,根据自己的代码风格选择就行~

内容的提问来源于stack exchange,提问作者Nino

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 16:12:30