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

Иллюстрация языков программирования Coddy

Учитесь программировать с Coddy

НАЧАТЬ