Menu

PHP str_replace():替换字符串中的文本

str_replace($search, $replace, $subject) 把每一处 $search 都替换成 $replace。学习用数组同时替换多个值、统计替换次数、不区分大小写的 str_ireplace,以及只替换第一处匹配。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

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 版本。

Coddy 编程语言插图

和 Coddy 一起学编程

开始