str_replace()适用于大多数批量字面替换场景,参数顺序为$search、$replace、$subject,不区分大小写、性能好;需注意不支持首次替换、正则、大小写敏感等,复杂需求应选preg_replace()或mb_*函数。

用 str_replace() 做最常用的批量替换
绝大多数场景下,直接用 str_replace() 就够了——它不区分大小写、支持数组批量操作、性能好,而且 PHP 4 就有,兼容性无压力。
常见错误是传错参数顺序:str_replace($search, $replace, $subject),很多人把 $subject 放前面,结果返回 null 或原样不变。
- 要替换多个不同子串,把
$search和$replace都设成数组,长度自动对齐(多的$replace元素会被忽略) - 如果只想要首次匹配就替换,得改用
preg_replace()配合1限制次数,str_replace()没这个开关 - 注意:它返回新字符串,不修改原变量;原字符串是
string类型,别误以为会像 JS 的replace()那样支持正则写法
需要大小写敏感或正则逻辑?上 preg_replace()
当你要“替换所有数字”“去掉 HTML 标签”“把连字符转下划线但保留单词首字母大写”,就得用正则。这时候 preg_replace() 是唯一选择。
容易踩的坑是忘记加定界符(比如写成 '\d+' 而不是 '/\d+/'),PHP 会直接报 Warning:PregException: Unknown modifier。
- 大小写无关用
i修饰符,全局替换默认就是全量,不用额外写g - 替换内容里含
$1、$2是合法的,但别写成\1(PCRE 默认用美元符,反斜杠是旧风格,易出错) - 性能比
str_replace()低不少,纯字面替换千万别套正则——尤其在循环里反复调用
strtr() 适合一对一字符映射,别拿来干别的
strtr() 的行为和 str_replace() 完全不同:它是按字符/子串长度优先、且**不可重叠替换**。比如 strtr('abbc', ['ab'=>'X', 'abb'=>'Y']) 结果是 'Xbc',不是 'Yc'。
典型适用场景只有两个:ASCII 字符批量转义(如把 +、/、= 替换成 URL 安全 Base64 字符),或者做简单编码表映射(如拼音首字母替换)。拿它做普通文本替换,很容易得到意料之外的结果。
- 传数组时,键是被替换内容,值是替换后内容;键不能是空字符串,否则警告
- 它不支持正则,也不支持限制次数,更不支持大小写忽略——这些都不是它的设计目标
- 如果搜索项有包含关系(比如同时想替
'a'和'ab'),顺序不重要,strtr()内部按长度降序处理
注意 mb_* 系列函数在中文等多字节场景下的必要性
用 str_replace() 处理中文时,如果源字符串是 UTF-8 编码,而你的开发环境 locale 是 C 或 en_US,某些边界情况(比如截断、偏移计算)可能出错——虽然字面替换通常没事,但一旦涉及长度判断、位置查找,就必须切到 mb_ 版本。
比如你想“把中文括号替换成英文括号”,用 str_replace('(', '(', $s) 能工作;但如果你想“从第 5 个汉字开始替换”,就必须用 mb_substr() + mb_strpos(),否则会按字节切,中文直接变乱码。
-
mb_eregi_replace()已废弃,PHP 7.3+ 不再支持;统一用mb_ereg_replace()+i修饰符,或直接上mb_preg_replace() - 确保
mb_internal_encoding('UTF-8')已设置,否则mb_*函数可能按 latin1 解析,导致长度算错 - 没开启
mbstring扩展时,这些函数根本不存在——上线前记得检查phpinfo()或extension_loaded('mbstring')
str_replace();一旦牵扯到位置、长度、编码、大小写策略,就得立刻停下来想清楚:当前函数到底按字节还是按字符处理,有没有隐式编码转换,以及——你是不是在拿锤子砸螺丝。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











