Menu

PHP preg_replace(): замена по регулярному выражению

preg_replace($pattern, $replacement, $subject) заменяет каждое совпадение регулярного выражения: preg_replace('/\s+/', ' ', $text) схлопывает пробелы. Обратные ссылки вроде $1, preg_replace_callback, удаление всего, кроме букв и цифр, ограничение и счётчик замен.

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

preg_replace($pattern, $replacement, $subject) находит в строке каждое совпадение регулярного выражения и заменяет его. preg_replace('/\s+/', ' ', $text) превращает каждую последовательность пробелов, табуляций и переносов строк в один пробел.

Исходная строка не меняется; preg_replace() возвращает новую. \b обозначает границу слова, поэтому cats остаётся нетронутым.

Обратные ссылки: 1,1, {1} и \1

В замене $1 означает то, с чем совпала первая группа захвата, $2 вторая, а $0 всё совпадение. С их помощью найденный текст можно переставить.

Пишите замену в одинарных кавычках. В двойных "\1" становится восьмеричной escape-последовательностью (байтом 0x01), а "${1}" читается как переменная с именем 1, которая не определена и использует строковый синтаксис, устаревший с PHP 8.2. '\1' в одинарных кавычках работает так же, как '$1', но $1 встречается чаще.

Удаление всего, кроме букв и цифр

Инвертированный класс символов, [^...], совпадает со всем, что не перечислено. Замена на '' это удаляет. Для текста на других языках используйте классы Unicode \p{L} (любая буква) и \p{N} (любая цифра) с модификатором u, иначе вы удалите é, ü, кириллицу и каждый японский символ.

Slug для URL

Несколько шаблонов подряд превращают заголовок в slug для URL. Сначала нижний регистр, потом каждую последовательность символов, не являющихся буквами или цифрами, замените одним дефисом, затем обрежьте дефисы по краям:

Несколько шаблонов, ограничение и счётчик

$pattern и $replacement могут быть массивами: каждый шаблон заменяется заменой с тем же индексом, по порядку. Четвёртый аргумент ограничивает число замен для каждого шаблона (-1 означает без ограничения), а пятый получает число выполненных замен.

Вычисление замены через preg_replace_callback

Когда замена зависит от совпадения, используйте preg_replace_callback(). Она вызывает вашу функцию один раз на каждое совпадение с массивом $matches и вставляет то, что функция вернёт. Стрелочная функция помещает короткие колбэки в одну строку.

preg_replace_callback_array() принимает массив пар pattern => callback, когда нескольким шаблонам нужна своя функция.

Текст замены из переменной

$ и обратный слеш в замене имеют смысл, поэтому замена, пришедшая от пользователя или из базы данных, может испортиться. Цена $10 читается как ссылка на группу 10, которой нет, и на выходе получается пустота:

Когда ни искомый текст, ни замена не являются шаблоном, str_replace() проще и быстрее. Чтобы проверить шаблон до замены, смотрите preg_match().

Часто задаваемые вопросы

Как использовать обратные ссылки в preg_replace?

Ссылайтесь на группы захвата в замене как $1, $2 (или \1): preg_replace('/(\d{4})-(\d{2})-(\d{2})/', '$3/$2/$1', '2026-03-14') возвращает "14/03/2026". Пишите замену в одинарных кавычках, а если за ссылкой идёт цифра, используйте ${1}.

Как удалить все символы, кроме букв и цифр, в PHP?

preg_replace('/[^a-zA-Z0-9]/', '', $s) оставляет только ASCII-буквы и цифры. Чтобы сохранить буквы любого языка (é, ü, ж, 日本語), используйте классы Unicode с модификатором u: preg_replace('/[^\p{L}\p{N}]/u', '', $s).

Чем preg_replace отличается от preg_replace_callback?

preg_replace() принимает фиксированную строку замены с плейсхолдерами $1. preg_replace_callback() вызывает функцию для каждого совпадения и использует её результат, поэтому замену можно вычислить: перевести в верхний регистр, посчитать что-то или найти в массиве.

Что использовать: str_replace или preg_replace?

Используйте str_replace(), когда заменяете фиксированный текст: она быстрее и не требует экранирования. Используйте preg_replace(), когда заменяемый текст подчиняется шаблону, например любая последовательность пробелов, любая цифра или граница слова.

Как заменить только первое совпадение через preg_replace?

Передайте ограничение четвёртым аргументом: preg_replace('/\d+/', '#', 'a1 b2 c3', 1) возвращает "a# b2 c3". Пятый аргумент, передаваемый по ссылке, получает число выполненных замен.

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

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

НАЧАТЬ