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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

php<?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<?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'
?>
Задание 1

Дана строка:

php<?php
  $str = 'The numbers are 3, 7 and 12';
?>

Замените все числа в строке на их квадраты.

Ожидаемый результат:

php'The numbers are 9, 49 and 144'
Задание 2

Дана строка:

php<?php
  $str = '2023-01-15 2022-12-31 2024-05-20';
?>

Преобразуйте все даты в формат день.месяц.год.

Задание 3

Дана строка:

php<?php
  $str = 'Costs: $15, $20, $100';
?>

Увеличьте все цены на 10%.