用 explode() 测字符串长度是错误的,因其返回的是分割后的段落数而非字符数;正确方法是:字节长度用 strlen(),多字节字符长度(如中文、emoji)必须用 mb_strlen($s, 'UTF-8')。

用 explode() 测字符串长度是错的
想通过 explode() 分割再取数组长度来判断原字符串“有多长”,本质混淆了「字符数」和「段落数」。比如 explode(',', 'a,b,c') 得到 3 个元素,但原字符串长度是 5;中间有连续逗号('a,,b')时,结果更不可靠——默认会忽略空段,除非显式传第三个参数。
strlen() 和 mb_strlen() 才是正解
测字节长度用 strlen(),测字符长度(尤其含中文、emoji)必须用 mb_strlen() 并指定编码,否则多字节字符会被算成多个字节。常见错误是直接对 UTF-8 字符串调 strlen(),返回值比实际“看起来的长度”大。
-
strlen('你好')→ 返回6(UTF-8 下每个汉字占 3 字节) -
mb_strlen('你好', 'UTF-8')→ 返回2 - 不传编码参数时,
mb_strlen()依赖mb_internal_encoding()当前值,线上环境可能不一致,务必显式传'UTF-8'
explode() 后取 count() 的真实用途
它只适合统计「以某分隔符切分出的非空逻辑单元数量」,比如 CSV 行字段数、路径层级、标签列表项数。但前提是:分隔符明确、数据格式可控。
- 要兼容空段,必须加第三个参数:
count(explode(',', $s, -1))(PHP 7.4+ 支持负数限制,保留末尾空项) - 分隔符本身是正则或含特殊字符(如点、星号),别硬套
explode(),改用preg_split() - 性能上,
explode()比mb_substr()或正则快,但仅限于单字节分隔符且无需编码感知的场景
容易被忽略的边界情况
空字符串、全分隔符字符串、超长字符串在不同 PHP 版本下行为略有差异,尤其涉及内存和 max_input_vars 限制时。
立即学习“PHP免费学习笔记(深入)”;
-
explode(',', '')返回[''],count()是1,不是0 -
explode(',', ',,')默认返回['', '', '']?错——实际是['', ''](末尾空串被丢弃),只有加-1才得 3 个 - 超过
memory_limit时,explode()可能静默失败或触发Fatal error: Allowed memory size exhausted,而strlen()几乎无开销
mb_strlen(),别绕路。分割后数数组只是数“块”,不是量“尺”。











