str_replace用于固定字符串的字面替换,速度快且安全;preg_replace依赖正则表达式,功能强但易出错、性能差,适用于需模式匹配的场景。

str_replace 适合替换固定字符串
它不解析正则,只做字面匹配,所以快、稳、无意外。比如把 "apple" 全部换成 "orange",或批量清理多个固定词:str_replace(['<script>', '<iframe>', 'javascript:'], '', $html)</script>。
常见错误是传入未转义的用户输入当 $search,结果 "a.b+c" 被当成正则片段(虽然它不会报错,但语义已变);其实它根本不管点号或加号——这点反而安全。
支持数组对数组映射替换,顺序执行,不回溯;$count 参数能返回实际替换次数,方便做条件判断。
preg_replace 必须用正则模式,不能当 str_replace 用
它的 $pattern 必须带分隔符,比如 "/abc/" 或 "#abc#"。漏写分隔符会直接报 Warning: preg_replace(): Delimiter must be alphanumeric or backslash。
立即学习“PHP免费学习笔记(深入)”;
用户输入若直接拼进 $pattern,极易触发正则注入或误匹配。例如搜索关键词 "price$",没用 preg_quote($keyword, '/') 转义,$ 就变成行尾锚点,结果啥也匹配不上。
性能差得多:10 万次简单替换,str_replace 约 0.38 秒,preg_replace 约 0.97 秒——多出一倍多开销全在 PCRE 解析上。
大小写和局部替换的实现方式不同
str_replace 区分大小写;要忽略大小写,得换 str_ireplace,它仍是字面匹配,只是做了 ASCII 级别 case-insensitive 比较。
preg_replace 用 i 修饰符实现忽略大小写,比如 "/hello/i",但它底层走的是正则引擎,比 str_ireplace 慢且更重。
两者都支持限制替换次数:str_replace($s, $r, $sub, 1) 替换第一个;preg_replace($p, $r, $sub, 1) 同样只换首次匹配。但注意:str_replace 的 $count 是引用参数,preg_replace 的第四个参数是整数上限,语义不一致。
精确匹配单词要用 preg_replace,str_replace 做不到
比如字符串 "I like apples and pineapple",只想替换独立单词 "apple",不碰 "pineapple"。str_replace 无法区分词边界,只能整个干掉。
这时必须用 preg_replace("/\bapple\b/", "orange", $text),\b 是单词边界断言,str_replace 完全不理解这个概念。
类似需求还有:替换所有邮箱、提取 URL、清理 HTML 标签内容——这些都不是“固定字符串”,而是“符合某种结构的文本”,绕不开 preg_replace,但也意味着你得真正懂正则,否则容易写错或被回溯爆栈(PREG_BACKTRACK_LIMIT_ERROR)。



















