Пусть у нас есть следующая строка:
<?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'
?>
Дана строка с целыми числами. С помощью регулярки преобразуйте строку так, чтобы вместо этих чисел стояли их квадраты.