ucwords() 不识别连字符等符号为词界,因其仅将空格后首个非空格字母大写;需用 str_replace 预处理、preg_replace_callback 精确匹配或 mb_convert_case 处理 utf-8 多语言场景。

PHP 的 ucwords() 函数默认只识别空格作为单词分隔符,**不会把连字符(-)、下划线(_)或点号(.)当作分词边界**,所以像 "hello-world" 会被整个当作一个单词,只大写开头的 h,结果是 "Hello-world",而不是你期望的 "Hello-World"。
为什么连字符不被识别?
ucwords() 的底层逻辑是:扫描字符串,遇到空格后,将下一个非空格字符转为大写。它不解析其他符号,也不做分词处理。连字符、下划线等在 ASCII 中属于“非字母非空格”字符,函数会原样保留,并跳过它们继续找下一个可大写的字母。
如何让连字符后的字母也大写?
需要手动扩展分隔逻辑。常用方法有:
-
用
str_replace()预处理:把连字符临时换成空格,调用ucwords(),再换回来。$s = str_replace('-', ' ', 'hello-world');<br> $s = ucwords($s);<br> $s = str_replace(' ', '-', $s); // → "Hello-World" -
用
preg_replace_callback()
精确匹配:捕获连字符/下划线后的字母并大写。$s = preg_replace_callback('/(^|[-_\.])([a-z])/', function($m) {<br> return $m[1] . strtoupper($m[2]);<br> }, 'hello-world_test.php'); // → "Hello-World_Test.Php" -
用
ucwords()+strtr()一次性替换多种分隔符为空格,处理完再还原(适合固定分隔符集)。
注意大小写敏感和非英文字符
ucwords() 只对 ASCII 字母有效,对中文、俄文或带重音的字母(如 é)无效。如果字符串含 UTF-8 多字节字符,建议改用 mb_convert_case($str, MB_CASE_TITLE, 'UTF-8'),它支持 Unicode,且能正确识别空格、连字符等作为词界(取决于系统 locale 和 PHP 版本,但通常比 ucwords() 更可靠)。
连字符本身不是标准词界,得靠额外处理。选哪种方式,取决于你的分隔符种类、是否含多语言、以及性能要求。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











