Замена з калбэкам праз рэгуляркі ў 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%.