
在PHP日常开发的字符串处理场景中,字符串截取是被高频使用的操作之一,无论是后台内容管理系统里文章摘要的生成、用户昵称在前端展示的长度控制,还是接口返回数据中字符串字段的规范化裁剪,都离不开各类字符串截取相关函数的支撑。PHP作为一门内置了丰富字符串处理能力的服务端语言,针对不同的编码场景、截取需求提供了多种实现方式,开发者只有理清不同函数的适用边界、注意事项和性能差异,才能在实际项目中选择最高效、最稳妥的截取方案,避免出现乱码、截取不准确、兼容性差等常见问题。

说到PHP中最基础的字符串截取函数,很多开发者最先想到的就是substr()函数,这个函数的语法结构为substr(string $string, int $offset, ?int $length = null),它的底层逻辑是基于字节位置进行截取操作,对于单字节编码的字符串比如ASCII编码的英文、数字字符来说,它的执行效率极高,调用方式也十分简单。比如我们要从字符串“Hello World”中截取从第6个字符开始的后续内容,只需要编写substr('Hello World', 6)就能得到“World”的结果,如果需要指定截取的长度,还可以传入第三个参数,比如substr('Hello World', 0, 5)就会返回前5个字符“Hello”。不过substr()函数的局限性也非常明显,当处理的是多字节编码的字符时,比如国内开发中最常用的UTF-8编码的中文字符,一个汉字通常占用3个字节,如果直接用substr()进行截取,很容易在汉字的中间字节处切断,最终输出的内容末尾会出现乱码,这种问题在早期很多没有做多字节适配的项目中十分常见,尤其是当截取的边界正好落在中文字符位置时,页面上会出现类似“�”的乱码符号,严重影响用户体验。
为了解决多字节字符串的截取问题,PHP的MBString扩展提供了mb_substr()函数,这也是目前处理UTF-8等多字节编码字符串截取的主流方案,mb_substr()的语法和substr()十分相似,只是多了一个可选的编码参数,完整语法为mb_substr(string $string, int $start, ?int $length = null, ?string $encoding = null),它是基于字符数而不是字节数进行截取的,因此不管是单字节的英文字符还是多字节的中文字符、emoji表情,都会被当作一个完整的字符来处理,从根本上避免了乱码问题。比如我们要截取UTF-8编码的中文句子“PHP字符串处理非常实用”的前5个字符,使用mb_substr('PHP字符串处理非常实用', 0, 5, 'UTF-8')就会得到“PHP字符”的准确结果,完全不会出现乱码。如果项目统一使用UTF-8编码,还可以通过mb_internal_encoding('UTF-8')设置默认的内部编码,后续调用mb_substr时就可以省略第四个编码参数,进一步简化代码写法。不过需要注意的是,MBString扩展并不是PHP默认开启的扩展,在一些精简版的PHP环境中可能没有启用,这时候开发者需要先检查扩展是否可用,或者寻找替代方案。
除了基础的按位置截取,实际开发中还有很多特殊的截取需求,比如按照指定的分隔符截取字符串的某一部分,这时候就可以用到explode()和strstr()这类函数。explode()函数可以将字符串按照指定的分隔符拆分成数组,之后通过数组下标就能获取到对应的截取内容,比如要从邮箱地址“user@example.com”中截取@符号前面的用户名部分,就可以先通过explode('@', $email)得到包含两个元素的数组,然后取第一个元素即可。而strstr()函数则可以直接查找字符串中某个子串第一次出现的位置,并返回从该位置开始到字符串末尾的所有内容,如果传入第三个参数为true,则会返回子串出现位置之前的内容,比如strstr('user@example.com', '@', true)就能直接得到用户名,相比explode()的方式不需要额外的数组操作,代码更简洁。另外还有strrchr()函数,它是查找子串最后一次出现的位置并返回后续内容,适合用来截取文件的后缀名,比如strrchr('document.pdf', '.')会返回“.pdf”,配合substr()去掉第一个字符就能得到纯后缀名。
在实际项目中,很多时候我们截取字符串并不是单纯的截断,还需要在末尾加上省略号来提示用户内容被截断,这时候很多开发者会手动判断字符串长度,超过指定长度就截取后拼接“...”,其实PHP还可以通过封装自定义函数来实现更完善的截取逻辑,比如同时兼容多字节编码、自动判断是否需要添加省略号、避免把HTML标签截断等进阶需求。比如针对包含HTML标签的内容进行截取时,如果直接用mb_substr()截取,很可能会把
这类标签从中间切断,导致页面布局错乱,这时候就需要先把HTML标签剥离,或者使用专门的HTML字符串截取类来处理,保证截取后的内容标签是闭合的。对于包含emoji表情的字符串,普通的mb_substr()在UTF-8编码下也能正常处理,因为emoji虽然占用的字节数更多,但依然是完整的Unicode字符,mb_substr()会将其识别为单个字符,不会出现截断的情况。
从性能层面来看,substr()作为原生的单字节截取函数,执行速度是所有截取方案中最快的,因为它不需要进行多字节的字符编码识别和计算,适合处理纯英文、数字的字符串场景,而mb_substr()因为需要解析多字节编码,性能会比substr()稍差一些,但在绝大多数Web应用场景下,这种性能差异几乎可以忽略不计,毕竟字符串截取的操作耗时和数据库查询、接口请求比起来占比极低。如果项目
本文由作者笔名:优维 于 2026-09-28 12:15:02发表在本站,原创文章,禁止转载,文章内容仅供娱乐参考,不能盲信。
本文链接: http://www.nxvc.vip/wen/5895.html