登录
首页 >  文章 >  php教程

PHP字符串长度获取方法全解析

时间:2026-04-11 20:31:48 285浏览 收藏

PHP中计算字符串长度看似简单,实则暗藏陷阱:`strlen()`按字节计数,处理中文、emoji等多字节字符时严重失真;真正可靠的方案是`mb_strlen($str, 'UTF-8')`,但必须确保mbstring扩展已启用、编码显式指定且输入字符串编码一致——否则可能返回0、false甚至引发线上故障;面对富文本还需清洗HTML标签和空白符,高并发场景下更要权衡精度与性能,而服务端校验逻辑更需与数据库(如MySQL utf8mb4)的字符级约束对齐,稍有疏忽就会导致前端显示异常、数据截断或校验失效。

php获取字符串长度 php怎么计算字符串字数【笔记】

strlen() 和 mb_strlen() 的区别到底在哪

PHP 里算字符串长度,strlen() 看起来最直接,但它只按字节算——中文、日文、emoji 全都“算错”。比如 "你好"strlen() 返回 6(UTF-8 下每个汉字占 3 字节),但你真正想问的“字数”是 2。mb_strlen() 才是按字符计数的正确工具,前提是 PHP 开启了 mbstring 扩展且指定了编码。

  • 没开 mbstring 扩展?mb_strlen() 直接报 Call to undefined function mb_strlen()
  • 没传第二个参数?mb_strlen($str) 依赖 mb_internal_encoding() 当前值,线上环境可能和本地不一致,建议显式写成 mb_strlen($str, 'UTF-8')
  • strlen() 处理英文或纯 ASCII 场景没问题,速度快;但只要涉及中文、繁体、emoji 或用户输入,必须切到 mb_strlen()

为什么 mb_strlen() 有时返回 0 或 false

常见于编码不匹配或字符串本身有问题。比如从数据库或 API 拿到的字符串实际是 GBK 编码,却用 mb_strlen($str, 'UTF-8') 去算,PHP 会把非法字节序列当作无效字符跳过,结果偏小甚至为 0;更糟的是,某些损坏的 UTF-8 字符串会让 mb_strlen() 返回 false(PHP 8.0+)。

  • 先用 mb_detect_encoding() 粗略判断(注意它不可靠,仅作参考),或更稳妥地:统一在接收入口做转码,例如 $str = mb_convert_encoding($str, 'UTF-8', 'auto')
  • 加一层防御:is_string($str) && $str !== '' ? mb_strlen($str, 'UTF-8') : 0
  • 别信前端传来的 Content-Type,HTTP header 和实际 payload 编码可能不一致

计算“可见字数”时要注意空格、换行和 HTML 标签

用户提交的富文本或表单内容常含


、多余空格或 \n\r。如果目标是“用户看到的字数”,得先清洗再计算。

  • 去 HTML 标签:mb_strlen(strip_tags($html), 'UTF-8'),但注意 strip_tags() 不处理自闭合标签如 ,也不过滤 JS 注入残留
  • 合并空白:mb_strlen(preg_replace('/\s+/u', ' ', trim($text)), 'UTF-8')/\s+/u 中的 u 修饰符确保 Unicode 安全
  • 避免在循环里反复调用 mb_strlen() —— 如果只是判断是否超长,用 mb_strcut($text, 0, $limit, 'UTF-8') === $text 更快(截取前后对比)

性能敏感场景下怎么选

高并发接口里每毫秒都重要。strlen() 是 C 层直接读 len 字段,几乎零开销;mb_strlen() 要逐字节解析多字节序列,慢一个数量级。不是所有“长度”都需要字符级精度。

  • 校验 HTTP 请求体大小、文件名长度限制、缓存 key 截断:用 strlen() 完全够用
  • 前端显示“还剩 X 字”,且字段支持中文:必须用 mb_strlen(),但可考虑缓存结果或异步更新
  • PHP 8.1+ 可用 mb_str_split() 配合 count(),但比 mb_strlen() 更慢,无必要

最常被忽略的一点:数据库字段定义里的 VARCHAR(255) 是按字符还是字节,取决于 MySQL 的 charsetcollation。UTF8MB4 下一个 emoji 占 4 字节,但仍是 1 个字符——服务端用 mb_strlen() 校验,才能和 DB 实际约束对齐。

好了,本文到此结束,带大家了解了《PHP字符串长度获取方法全解析》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多文章知识!

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>