str_replace()用于字面量批量替换,不支持正则;需注意参数顺序与数组对齐;忽略大小写用str_ireplace();复杂模式匹配必须用preg_replace();两者均支持替换次数统计。

用 str_replace() 做基础替换最直接
绝大多数场景下,str_replace() 就是你要找的函数。它不区分大小写、支持批量替换、能处理数组输入,且性能足够好。
常见错误是把搜索项和替换项顺序搞反,或者误以为它支持正则 —— 它完全不支持正则语法,只做字面匹配。
-
str_replace('old', 'new', $str):单次简单替换 -
str_replace(['a', 'b'], ['x', 'y'], $str):多个目标批量替换,数组长度需对齐 -
str_replace('foo', '', $str):删掉某子串,等价于“替换成空字符串” - 第三个参数必须是字符串;若传入数组,会逐元素处理并返回同结构数组
需要忽略大小写?用 str_ireplace()
str_ireplace() 和 str_replace() 行为一致,唯一区别是忽略大小写匹配。别试图用 strtolower() 配合 str_replace() 模拟,那会破坏原始大小写格式,且多一次遍历。
注意:它仍是字面匹配,不是正则。比如想把 “PHP”、“php”、“Php” 都替换成 “Python”,str_ireplace('php', 'Python', $str) 就够了,不用写三个变体。
- 性能略低于
str_replace(),但差异微乎其微,日常无需顾虑 - 中文、UTF-8 多字节字符正常工作,前提是 PHP 环境默认编码为 UTF-8(现代版本基本都满足)
- 不支持指定字符编码参数,依赖当前脚本编码环境
要按模式替换(比如“数字+字母”组合)?必须上 preg_replace()
一旦需求超出字面匹配范围——比如替换所有连续数字、提取邮箱、清理 HTML 标签内属性——str_replace() 就无能为力了,必须切换到正则方案。
典型坑是过度使用正则:有人哪怕只是替换固定字符串也写 preg_replace('/abc/', 'xyz', $str),这比 str_replace() 慢 3–5 倍,还容易引入转义错误。
-
preg_replace('/\d+/', '[num]', $str):把所有数字串替换成 “[num]” - 记得分隔符(如
/)要成对,特殊字符如.、+、(在模式中需反斜杠转义 - 如果只是查找不替换,用
preg_match();如果只替换一次,加1作为第四个参数:preg_replace($p, $r, $s, 1)
替换后要统计次数?str_replace() 和 preg_replace() 都支持计数参数
两个函数第四个参数都是引用传入的整数变量,调用后自动填入实际替换次数。这个功能常被忽略,但对日志、校验、限流逻辑很实用。
注意:该参数是「成功替换的次数」,不是「匹配到的次数」。比如把 “aaa” 替换成 “b”,str_replace('a', 'b', 'aaa', $count) 后 $count 是 3;但若替换目标不存在,$count 为 0,且变量会被初始化(即使之前有值)。
- 必须传变量引用:
str_replace('x', 'y', $s, $cnt)中$cnt前不能加&(PHP 7.4+ 自动引用) -
preg_replace()的计数逻辑相同,但受正则全局标志g影响(PHP 中默认开启) - 若只需知道是否发生替换,检查返回值是否等于原字符串更轻量
str_replace() 版本,再根据反馈迭代。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











