PHP字符串转小写应优先用mb_strtolower($str, 'UTF-8'),因strtolower()仅支持ASCII;处理JSON/HTML需先解析再转换文本内容,避免破坏结构。

PHP 字符串转小写用 strtolower(),但要注意编码
直接用 strtolower() 能处理 ASCII 字符(英文、数字、符号),但遇到中文、日文、俄文或带重音的西欧字母(比如 é, ñ)会出乱码或原样返回——它只认单字节编码,不支持 UTF-8。
- 如果确定字符串全是英文,
strtolower('HELLO WORLD')→'hello world'安全可靠 - 如果字符串来自表单、数据库或 API,大概率是 UTF-8 编码,这时必须换函数
- 别试图用
mb_strtolower($str, 'UTF-8')却漏写第二个参数:默认编码依赖mb_internal_encoding()设置,线上环境常不一致,显式传参更稳
UTF-8 字符串转小写必须用 mb_strtolower()
mb_strtolower() 是多字节安全的替代方案,但行为和 strtolower() 不完全一样:它依赖系统安装的 mbstring 扩展,且对某些语言(如土耳其语)的大小写规则支持有限。
- 确保扩展已启用:
extension=mbstring在php.ini中未被注释 - 调用时务必指定编码:
mb_strtolower($str, 'UTF-8'),不能只写mb_strtolower($str) - 注意空字符串或
null输入:mb_strtolower(null, 'UTF-8')返回''(空字符串),不是null,业务逻辑里要提前判断 - 性能上比
strtolower()略慢,高频调用场景(如循环处理上万条数据)可先用is_ascii_only($str)快速分支判断,再分发处理
为什么 mb_convert_case() 不推荐用于单纯转小写
mb_convert_case() 支持 MB_CASE_LOWER,看起来功能重叠,但它设计初衷是做「词首大写」「全大写」等复合转换,内部做了额外的语言区域检测,开销更大,且在部分 PHP 版本中对非拉丁语系支持不稳定。
- 纯转小写场景下,
mb_strtolower()更轻量、行为更可预测 -
mb_convert_case($str, MB_CASE_LOWER, 'UTF-8')和mb_strtolower($str, 'UTF-8')结果通常一致,但前者多一层抽象,出问题时排查路径更长 - 除非你在同一段逻辑里还要做标题化(
MB_CASE_TITLE)或首字母大写,否则没必要引入这个函数
常见错误:用 strtoupper() / strtolower() 处理 JSON 或 HTML 字符串
直接对整个 JSON 字符串或 HTML 片段调用大小写函数,会破坏结构——比如把 "id" 变成 "ID" 导致 JSON 解析失败,或把 <div> 变成 <code><div> 后又混入大写属性值引发渲染异常。<p><span>立即学习</span>“<a href="https://pan.quark.cn/s/7fc7563c4182" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">PHP免费学习笔记(深入)</a>”;</p>
<ul>
<li>先提取需转换的文本内容(如用 <code>json_decode() 解析后再处理字段值),再转大小写
DOMDocument)读取文本节点,避免正则或全量字符串替换mb_strtolower("İ", 'UTF-8')(带点大写 I,土耳其语)在不同 ICU 版本下结果可能不同,这种语言敏感操作,上线前最好拿真实语料跑一遍。











