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-буквы. Для замены без учёта регистра букв с диакритикой или кириллицы используйте preg_replace() с модификаторами i и u.
Замена только первого вхождения
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_ не нужна.