# Замена с коллбэком через регулярки в PHP

Пусть у нас есть следующая строка:

`<?php $str = '2+3= 3+5= 7+8='; ?>`

Пусть нам нужно найти все конструкции вида число+число= и сделать так, чтобы после равно появился результат сложения.

Для решения подобной задачи удобно воспользоваться функцией `preg_replace_callback`, которая работает аналогично функции `preg_replace` - находит и заменяет по регулярному выражению, но позволяет выполнять дополнительные манипуляции с найденными кусочками.

Первым параметром функция принимает регулярку, вторым - на что меняем, третьим - строку, в которой осуществляется замена.

При этом во второй параметр следует передавать функцию-коллбэк, которая будет вызвана для каждого найденного совпадения.

Первым параметром коллбэка нужно указать переменную, в которую будет попадать найденное. Эта переменная будет представлять собой массив карманов найденного.

Давайте попробуем на практике. Напишем, код, который поймает наши подстроки, при этом положив первое число в первый карман, а второе - во второй:

`<?php $str = '2+3= 3+5= 7+8='; preg_replace_callback('#(\d+)\+(\d+)=#', function($match) { var_dump($match); }, $str); ?>`

В результате наш `var_dump` сработает три раза, по очереди выведя следующее:

`['2+3=', '2', '3'] ['3+5=', '3', '5'] ['7+8=', '7', '7']`

Идем дальше. Каждое совпадение будет заменено на то, что возвращает коллбэк через `return`. Давайте для примера заменим каждую из искомых подстрок на знак `'!'`:

`<?php $str = '2+3= 3+5= 7+8='; $res = preg_replace_callback('#(\d+)\+(\d+)=#', function($match) { return '!'; }, $str); echo $res; // выведет '! ! !' ?>`

А теперь заменим каждую подстроку на сумму пары чисел в ней:

`<?php $str = '2+3= 3+5= 7+8='; $res = preg_replace_callback('#(\d+)\+(\d+)=#', function($match) { return $match[1] + $match[2]; }, $str); echo $res; // выведет '5 8 13' ?>`

Получается, что наша задача почти решена. Осталось сделать так, чтобы перед суммой чисел оставалась искомая подстрока. Для этого будем вставлять перед суммой содержимое нулевого кармана:

`<?php $str = '2+3= 3+5= 7+8='; $res = preg_replace_callback('#(\d+)\+(\d+)=#', function($match) { return $match[0] . ($match[1] + $match[2]); }, $str); echo $res; // выведет '2+3=5 3+5=8 7+8=13' ?>`

Дана строка с целыми числами. С помощью регулярки преобразуйте строку так, чтобы вместо этих чисел стояли их квадраты.

←→
↑