Замена с коллбэком через регулярки в 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' ?>

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