PHP实现字符串除末尾字符外转小写、末尾字符大写的技术问询
原代码验证与优化方案
首先,你的代码确实是可行的!我们来拆解一下它的逻辑:
strrev($var)将输入字符串反转,把"HeLlo WOrld"变成"dlrO olleH"ucwords(...)会把每个单词的首字母大写(这里的"首字母"其实是原单词的尾字母),反转后的字符串变成"DlrO OlleH"- 再次
strrev(...)反转回来,就得到了预期的"hellO worlD"
不过这个写法有点绕,可读性稍差,而且ucwords默认只识别空格作为单词分隔符,如果你的场景里有其他单词分隔符(比如下划线、连字符),结果可能不符合预期。下面提供一个更直观、更灵活的优化方案:
function caps_caps($var) { // 按空格拆分单词,支持多个连续空格的情况 $words = preg_split('/\s+/', $var, -1, PREG_SPLIT_NO_EMPTY); $processedWords = []; foreach ($words as $word) { $wordLength = strlen($word); // 处理单字符单词的情况 if ($wordLength === 1) { $processedWords[] = strtoupper($word); continue; } // 截取除最后一个字符外的部分转小写,最后一个字符转大写 $lowerPrefix = strtolower(substr($word, 0, $wordLength - 1)); $upperSuffix = strtoupper(substr($word, -1)); $processedWords[] = $lowerPrefix . $upperSuffix; } $result = implode(' ', $processedWords); echo $result; return $result; } // 测试调用 caps_caps("HeLlo WOrld"); // 输出 hellO worlD caps_caps("a"); // 输出 A caps_caps("test-case"); // 如果需要处理连字符单词,可调整拆分规则
这个方案的优势:
- 逻辑清晰,一眼就能看出是对每个单词单独处理,把前缀转小写、尾字符转大写
- 使用
preg_split处理单词拆分,能兼容多个连续空格的场景,避免生成空单词 - 单独处理了单字符单词的边界情况,逻辑更严谨
内容的提问来源于stack exchange,提问作者John Smith
相关产品推荐
相关产品推荐

