НОВИНКА!
Занимательная математика от Трепачёва. Присоединяйтесь к нам!
⊗ppPmRgRCb 260 of 447 menu

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

Дана строка:

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

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

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

'The numbers are 9, 49 and 144'

Дана строка:

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

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

Дана строка:

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

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

Русский
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить