最稳妥的是substr($str, 0, 1),兼容所有php版本且对ascii安全;含中文需用mb_substr()并确保mbstring启用;取首非空白字符应先trim()再substr()。

用 substr() 最稳妥,别碰 mb_substr() 除非真要处理中文
PHP 里取首字符最常用也最安全的方式就是 substr($str, 0, 1)。它不依赖扩展、兼容所有 PHP 版本(包括 5.6),对 ASCII 字符(英文、数字、符号)完全可靠。
- 如果字符串为空或
null,substr()返回空字符串,不会报错 - 不要用
$str[0]—— 在 PHP 7.4+ 中对非字符串类型(比如null或数组)会触发警告;8.0+ 更是直接报TypeError -
mb_substr($str, 0, 1, 'UTF-8')确实能正确截中文首字,但多一次函数调用、多一个编码参数,纯英文场景纯属冗余
strlen() 和 mb_strlen() 判断长度前必须想清楚编码
有人先用 strlen() 判断是否为空再取首字符,这没问题;但如果字符串可能含中文,又只用 strlen() 做长度判断,后续用 substr() 取出来的可能不是“第一个字”,而是半个 UTF-8 字节序列——显示成乱码或 。
- 纯英文/ASCII 场景:用
strlen($str) > 0安全,配合substr($str, 0, 1) - 混合中英文或不确定编码:统一用
mb_strlen($str, 'UTF-8') > 0判断,再用mb_substr($str, 0, 1, 'UTF-8') - 没开
mbstring扩展?mb_*()函数会 fatal error,上线前务必确认extension=mbstring已启用
正则 preg_match() 是重武器,日常别用
看到有人写 preg_match('/^./u', $str, $m) 来取首字符,逻辑没错,但完全没必要。
- 正则启动开销比
substr()高得多,尤其短字符串下差异明显 -
/^./u的u修饰符依赖 PCRE UTF-8 支持,某些旧环境可能不生效 - 如果字符串以空白开头(比如空格、\t),
^.会匹配到那个空白——而你真正想要的可能是“第一个非空白字符”,这时得换模式,复杂度立刻上升
注意 trim() 是否该提前介入
很多实际场景里,“首字符”指的是首个可见字符,而非位置 0 的字节。比如用户输入 " Hello",你大概率想要的是 H,而不是空格。
立即学习“PHP免费学习笔记(深入)”;
- 如果业务语义是“第一个非空白字符”,先
$str = trim($str)再取首字符 - 但
trim()本身也受mbstring影响:默认只处理 ASCII 空白;含中文全角空格( )需用mb_trim()(PHP 8.2+)或手动替换 - 频繁调用时,
trim()+substr()比单次preg_replace('/^\s+/', '', $str)[0]更快且更易读










