php 7.4 中判断字符串长度必须用 mb_strlen($keyword, 'utf-8') 而非 strlen(),以准确计数中文、emoji 等多字节字符;截取用 mb_substr(..., 0, 20, 'utf-8');判空推荐 $keyword === '' 或 trim 后 mb_strlen 验证。

PHP 7.4 中判断字符串长度用于搜索关键词,核心是**按字符数而非字节数计数**,否则中文、越南文、emoji 等多字节字符会导致关键词截断错误、匹配失效或前端显示异常。
必须用 mb_strlen() 替代 strlen()
搜索关键词常含中文、标点、表情等,strlen() 返回的是字节数,对 "你好" 返回 6,但实际只有 2 个字符——这会让“最多输入 10 字”的限制形同虚设。正确做法:
- 统一使用 mb_strlen($keyword, 'UTF-8') 获取真实字符长度
- 第2个参数 'UTF-8' 必须显式传入,避免依赖服务器默认编码(线上环境易不一致)
- 若关键词为空或非字符串,先做类型校验:is_string($keyword) && mb_strlen($keyword, 'UTF-8') > 0
关键词截取要安全,用 mb_substr()
用户可能粘贴超长关键词(如整段文案),后端需截断再搜索。直接 substr() 会切碎中文,导致乱码或关键词失真:
- 用 mb_substr($keyword, 0, 20, 'UTF-8') 截取前 20 个字符,不是 20 字节
- 截取后仍需用 mb_strlen(..., 'UTF-8') 验证是否达标(例如要求至少 2 字才触发搜索)
- 避免写成
mb_substr($keyword, 0, 20)—— 缺少编码参数在部分配置下会退化为字节截取
前后端长度需对齐,尤其带 emoji 的关键词
用户在前端输入 "?搜索",JS 中 "?搜索".length === 4(? 占 2 个码元),但 PHP 的 mb_strlen("?搜索", 'UTF-8') 返回 3(1 个 emoji + 2 个汉字)。若搜索接口按前端长度限流(如 max 10),需模拟 JS 行为:
- 定义函数:function jsStrLen(string $s): int { return strlen(mb_convert_encoding($s, 'UTF-16LE', 'UTF-8')) / 2; }
- 用
jsStrLen($keyword) 做准入判断,与前端完全一致 - 注意:该方式要求 mbstring 扩展启用,且目标编码必须是 'UTF-16LE'(非 UTF-16)
空值与无效输入要严格过滤
搜索关键词不能只判 strlen($k) > 0,null、false、全角空格、零宽字符都可能导致意外行为:
- 最可靠判空:$keyword === ''(严格等于空字符串)
- 去首尾空白后判空:mb_strlen(trim($keyword), 'UTF-8') === 0
- 清除不可见字符后再处理:preg_replace('/[\p{C}\s]+/u', '', $keyword)(匹配所有 Unicode 控制符和空白)
- 禁止直接对数据库字段或函数返回值(如 strpos())调用 mb_strlen(),先确保是字符串
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











