str_replace($search, $replace, $subject) 返回 $subject 的一个副本,其中每一处 $search 都被替换成 $replace。str_replace('world', 'PHP', 'Hello world') 返回 "Hello PHP"。
这个函数返回新字符串,不会修改你传入的变量。要把结果赋值保存,赋回同一个变量也可以:$text = str_replace(...)。
语法
str_replace(
array|string $search,
array|string $replace,
string|array $subject,
int &$count = null
): string|array
前三个参数都可以是字符串或数组。如果 $subject 是数组,替换会作用于每个元素,返回一个键不变的数组:str_replace('.txt', '.md', ['a.txt', 'b.txt']) 返回 ['a.md', 'b.md']。查找区分大小写,匹配的是普通文本,而不是模式。要按模式替换,用 preg_replace()。
一次替换多个字符串
给 $search 和 $replace 传入数组。第一个查找值换成第一个替换值,第二个换成第二个,依此类推。如果 $replace 是单个字符串,所有查找值都会被它替换,这是删除一组字符的简便写法。
顺序陷阱与 strtr()
传入数组时,str_replace() 会在整个字符串上一个接一个地执行替换。后面的查找值可能匹配到前一次替换刚插入的文本。strtr() 配合数组则一遍完成所有替换,优先尝试最长的键,而且不会再碰已经替换过的文本。
做互换,或者处理可能出现在值里的模板占位符时,用 strtr()。
统计替换次数
第四个参数会被填入实际替换的次数。传入一个变量,PHP 会往里面写值。
用 str_ireplace 不区分大小写地替换
str_ireplace() 接收同样的参数,匹配时忽略大小写。插入的替换内容和你写的完全一样。
str_ireplace() 只处理 ASCII 字母的大小写。要不区分大小写地替换带重音的字母或西里尔字母,用带 i 和 u 修饰符的 preg_replace()。
只替换第一处匹配
str_replace() 总是替换全部。要只替换第一处匹配,先用 strpos() 找到它,再用 substr_replace() 把它换掉:
要替换最后一处,用 strrpos() 代替 strpos()。
删除空格、换行和其他字符
替换成空字符串就是删除文本。常见的清理操作是去掉换行或所有空格。日文和中文输入里常常带有全角空格( ,U+3000),普通的 " " 匹配不到它。
在数组里把 "\r\n" 放在 "\n" 和 "\r" 前面,这样 Windows 的换行会变成一个空格,而不是两个。
常见问题
PHP 中怎么替换字符串里的文本?
用 str_replace($search, $replace, $subject):str_replace('cat', 'dog', 'cat and cat') 返回 "dog and dog"。它会替换每一处匹配,并返回一个新字符串,原字符串不变。
str_replace 区分大小写吗?
区分。str_replace('php', 'PHP', 'Php') 什么也不会改。改用 str_ireplace(),它接收同样的参数,匹配时忽略大小写。
PHP 中怎么只替换第一处匹配?
str_replace() 没有限制次数的参数。用 strpos() 找到位置,再用 substr_replace($s, $replace, $pos, strlen($search)),或者用 preg_replace('/' . preg_quote($search, '/') . '/', $replace, $s, 1)。
PHP 中怎么一次替换多个字符串?
传入数组:str_replace(['a', 'b'], ['1', '2'], $s)。替换按顺序执行,所以后面的查找值可能匹配到前面刚插入的文本。strtr($s, ['a' => '1', 'b' => '2']) 一遍完成所有替换,不会重复替换。
str_replace 能处理中文、日文等文本吗?
能。str_replace() 按字节匹配,而一个完整的 UTF-8 字符永远不会匹配到另一个字符的中间,所以 str_replace('東京', '大阪', $s) 是安全的。不需要 mb 版本。