str_replace()适用于快速、字面量的字符串替换,不支持正则;需区分大小写用str_ireplace(),批量替换传数组;正则替换必须用preg_replace()并注意分隔符与转义。

用 str_replace() 做最常用的字符串替换
绝大多数时候,你只需要 str_replace() —— 它快、兼容性好(PHP 4 就有)、语义直白。传入旧子串、新子串、原字符串,直接返回结果,原变量不会被修改。
常见错误是以为它支持正则,结果写成 str_replace('/\d+/', 'X', $s),完全没效果:它只做字面匹配,不认正则元字符。
- 区分大小写:用
str_replace();不区分就用str_ireplace() - 想批量替换多个不同值?把第一个参数写成数组:
str_replace(['a', 'b'], ['x', 'y'], $s) - 注意返回值:它返回新字符串,不是修改原变量,所以别忘了赋值:
$s = str_replace(...) - 性能敏感场景(比如循环内高频调用),避免重复传入大数组;提前定义好搜索/替换数组比每次构造快
需要正则替换时,必须用 preg_replace()
当你要匹配数字、空格、邮箱格式,或者按位置、重复次数来替换,str_replace() 就不够用了,得上 preg_replace()。
典型翻车点:忘记分隔符(比如写成 preg_replace('\d+', 'N', $s)),PHP 直接报 Warning:“No ending delimiter”。正则必须带分隔符,常用 / 或 #。
立即学习“PHP免费学习笔记(深入)”;
- 正确写法:
preg_replace('/\d+/', 'N', $s)或preg_replace('#\s+#', ' ', $s) - 替换前先
preg_quote($needle, '/')—— 如果 $needle 来自用户输入,且含/、.、+这类正则特殊字符,不转义就会崩 -
preg_replace()在 PHP 8.3+ 支持PREG_UNMATCHED_AS_NULL标志,能避免空匹配导致的意外截断,但老版本不认,别乱加 - 纯字符串替换还用正则?大概率是过度设计,慢且易错
替换后要保留原始变量结构?小心引用和编码陷阱
PHP 字符串是值传递,但如果你在函数里改 &$str,或用 mb_* 系列函数处理中文,编码不对就直接乱码或截断。
常见现象:中文字符串里替换了几个字,结果后面全变问号或空格;或者 mb_substr() 切出来的偏移量,直接喂给 str_replace() 导致错位。
- 确认源字符串编码:用
mb_detect_encoding($s)看是不是 UTF-8;如果不是,先mb_convert_encoding($s, 'UTF-8') - 涉及中文、emoji 的替换,优先用
mb_ereg_replace()(已废弃)或preg_replace()配合u修饰符:preg_replace('/\p{Han}+/u', '【汉字】', $s) - 别对超长字符串(比如几 MB 的日志文本)直接
str_replace()—— 内存暴涨,考虑流式处理或substr_replace()定点操作
strtr() 和 substr_replace() 的特定用途
strtr() 不是 str_replace() 的替代品,而是“字符映射”专用:适合做字母大小写翻转、密码简单替换、ASCII 表对照等。它按字符逐个映射,不是子串查找。
substr_replace() 更冷门,但当你明确知道要从第 N 位开始、删 M 个、插新内容时,它比拼接更安全(尤其二进制数据)。
-
strtr($s, 'abc', 'xyz'):把 a→x、b→y、c→z,一一对应,不重叠不回溯 -
strtr($s, ['ab' => 'X', 'abc' => 'Y']):这时是前缀最长匹配,'abc'会优先生效 -
substr_replace($s, 'NEW', 5, 3):从第 5 位起,删掉 3 个字符,插入'NEW';负数偏移表示从末尾算 - 三者性能排序(小字符串):
str_replace()≈strtr()>substr_replace();但语义不同,别为快而硬套











