Zamena sa callback-om preko regularnih izraza u PHP-u
Recimo da imamo sledeći string:
<?php
$str = '2+3= 3+5= 7+8=';
?>
Recimo da treba da pronadjemo sve konstrukcije oblika broj+broj= i da postignemo da nakon znaka jednakosti se pojavi rezultat sabiranja.
Za rešavanje ovakvog zadatka zgodno je koristiti
funkciju preg_replace_callback, koja
radi analogno funkciji preg_replace
- pronalazi i zamenjuje prema regularnom izrazu,
ali omogućava izvođenje dodatnih manipulacija
sa pronađenim delovima.
Prvi parametar funkcija prima regularni izraz, drugi - na šta menjamo, treći - string, u kome se vrši zamena.
Pritom u drugi parametar treba proslediti funkciju-callback, koja će biti pozvana za svako pronađeno poklapanje.
Prvim parametrom callback-a treba naznačiti promenljivu u koju će upadati pronađeno. Ta promenljiva će predstavljati niz "capture group"-ova (džepova) pronađenog.
Hajde da probamo u praksi. Napišimo kod koji će da uhvati naše podstringove, pri čemu će prvi broj smestiti u prvi capture group, a drugi - u drugi:
<?php
$str = '2+3= 3+5= 7+8=';
preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
var_dump($match);
}, $str);
?>
Kao rezultat, naš var_dump će se aktivirati
tri puta, redom ispisujući sledeće:
['2+3=', '2', '3']
['3+5=', '3', '5']
['7+8=', '7', '7']
Idemo dalje. Svako poklapanje će biti zamenjeno
onim što callback vrati putem return.
Hajde za primer da zamenimo svaki od traženih
podstringova znakom '!':
<?php
$str = '2+3= 3+5= 7+8=';
$res = preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
return '!';
}, $str);
echo $res; // ispisaće '! ! !'
?>
A sada da zamenimo svaki podstring zbirom parova brojeva u njemu:
<?php
$str = '2+3= 3+5= 7+8=';
$res = preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
return $match[1] + $match[2];
}, $str);
echo $res; // ispisaće '5 8 13'
?>
Ispostavlja se da je naš zadatak skoro rešen. Ostalo je da postignemo da se ispred zbira brojeva zadrži traženi podstring. Za ovo ćemo da umetnemo ispred zbira sadržaj nultog capture group-a:
<?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; // ispisaće '2+3=5 3+5=8 7+8=13'
?>
Dat je string:
<?php
$str = 'The numbers are 3, 7 and 12';
?>
Zamenite sve brojeve u stringu njihovim kvadratima.
Očekivani rezultat:
'The numbers are 9, 49 and 144'
Dat je string:
<?php
$str = '2023-01-15 2022-12-31 2024-05-20';
?>
Pretvorite sve datume u format dan.mesec.godina.
Dat je string:
<?php
$str = 'Costs: $15, $20, $100';
?>
Povećajte sve cene za 10%.