PHP实现:全大写单词转小写且保留首字母大写单词,现有代码失效
解决全大写单词转小写、保留合法首字母大写单词的问题
我懂你的困扰——原代码ucfirst(strtolower($string))会先把整个字符串转成全小写,直接毁掉了那些已经是「首字母大写其余小写」的正确单词,比如示例里的Sentence和Care都会被改成全小写,这显然不是你想要的效果。
要实现你的需求,我们需要精准定位全大写的单词,只把这些单词转成小写,同时保留原本格式正确的单词,最后再确保句子首字母大写。这里用正则表达式配合回调函数就能完美解决:
$string = 'THIS IS A Sentence that should be TAKEN Care of'; // 第一步:匹配所有全大写的单词,将其转为小写 $processedString = preg_replace_callback( '/\b[A-Z]+\b/', // 匹配由一个或多个大写字母组成的完整单词 function($matches) { return strtolower($matches[0]); }, $string ); // 第二步:确保整个句子的首字母大写 $result = ucfirst($processedString); echo $result; // 输出:This is a Sentence that should be taken Care of
代码解释
- 正则
/\b[A-Z]+\b/:\b代表单词边界,确保我们匹配的是完整的全大写单词,不会误触到混合大小写的单词(比如Sentence里的大写S不会被单独匹配);[A-Z]+匹配一个或多个连续的大写字母。 preg_replace_callback()会遍历字符串,只把匹配到的全大写单词转成小写,其他单词保持原样。- 最后用
ucfirst()处理整个字符串,保证句子开头的首字母是大写的(比如原句开头的THIS转成this后,会被改成This)。
这样处理后,既把所有全大写的单词(包括单个大写字母A)转成了小写,又完美保留了原本格式正确的Sentence和Care,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Jens Törnell
相关产品推荐
相关产品推荐

