strtr基于原始字符串并行映射,str_replace顺序叠加替换;strtr支持字符级和字符串级两种模式,str_replace仅子串替换;strtr不支持空值替换(除数组形式),str_replace支持;strtr性能高且安全,str_replace更灵活。

strtr 是按原始字符串逐轮映射,str_replace 是顺序叠加替换
strtr 处理多个替换时,所有替换都基于原始字符串进行,互不干扰。比如 strtr("apple", ["a"=>"b", "p"=>"c"]) 中,两个替换同时作用于 "apple",结果是 "bccc"(a→b,两个 p→c),不会出现先替 a 得到 "bpple"、再在新串里替 p 的情况。
str_replace 则是“边改边用”:前一次替换产生的新子串,可能成为后一次替换的匹配目标。例如 str_replace(["ab", "bc"], ["x", "y"], "abc"),先将 "ab" 替为 "x" 得到 "xc",再在 "xc" 中找 "bc" —— 找不到,最终结果是 "xc";但如果顺序反过来,就可能产生不同结果。
strtr 支持两种模式:字符级替换和字符串级映射
strtr 有两种调用方式:
- strtr($str, $from, $to):把 $from 中每个字符,一对一映射到 $to 中对应位置的字符。如果 $from 比 $to 长,多出的字符被忽略;任一参数为空字符串,整个调用无效。
- strtr($str, $map):$map 是关联数组,键为待替换子串,值为替换内容。它按键长度从长到短匹配,且严格区分边界(不会把 "cat" 里的 "at" 单独提出来换)。
str_replace 没有字符级模式,只支持子串查找替换,且不保证最长匹配优先,容易出现重叠误替。
strtr 不支持空替换值,str_replace 可以安全替换为空
用 strtr 做 strtr("hello", "lo", "") 不会做任何替换,返回原串;但 strtr("hello", ["l"=>"", "o"=>""]) 是合法的,会删掉所有 l 和 o。
而 str_replace 对空字符串完全友好:str_replace(["l","o"], "", "hello") 直接输出 "he",无异常。
性能与适用场景差异明显
strtr 在纯映射场景(如字符编码转换、模板变量统一替换)中更快更安全,尤其适合防止替换污染(比如避免把 "user_id" 里的 "id" 错替成其他内容)。
str_replace 更灵活,支持数组对数组的一一映射、可统计替换次数、能处理大小写不敏感变体(str_ireplace),也更适合动态生成替换规则或需链式替换逻辑的业务。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











