Înlocuire cu callback prin expresii regulate în PHP
Să presupunem că avem următorul șir:
<?php
$str = '2+3= 3+5= 7+8=';
?>
Să presupunem că trebuie să găsim toate construcțiile de forma număr+număr= și să facem astfel încât după semnul egal să apară rezultatul adunării.
Pentru rezolvarea unei astfel de probleme este convenabil să folosim
funcția preg_replace_callback, care
funcționează similar cu funcția preg_replace
- găsește și înlocuiește după o expresie regulată,
dar permite efectuarea de manipulări suplimentare
cu fragmentele găsite.
Primul parametru al funcției primește expresia regulată, al doilea - cu ce să înlocuim, al treilea - șirul în care se efectuează înlocuirea.
În acest caz, celui de-al doilea parametru trebuie să i se transmită o funcție-callback, care va fi apelată pentru fiecare potrivire găsită.
Primul parametru al callback-ului trebuie să fie o variabilă în care va intra rezultatul găsit. Această variabilă va fi un array al grupurilor (capturilor) găsite.
Să încercăm în practică. Să scriem cod care să prindă subșirurile noastre, punând primul număr în primul grup, iar al doilea - în al doilea:
<?php
$str = '2+3= 3+5= 7+8=';
preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
var_dump($match);
}, $str);
?>
Ca rezultat, var_dump-ul nostru
va funcționa de trei ori, afișând pe rând
următoarele:
['2+3=', '2', '3']
['3+5=', '3', '5']
['7+8=', '7', '7']
Mergem mai departe. Fiecare potrivire va fi înlocuită
cu ceea ce returnează callback-ul prin return.
Să înlocuim, de exemplu, fiecare dintre subșirurile căutate
cu semnul '!':
<?php
$str = '2+3= 3+5= 7+8=';
$res = preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
return '!';
}, $str);
echo $res; // va afișa '! ! !'
?>
Și acum să înlocuim fiecare subșir cu suma perechii de numere din el:
<?php
$str = '2+3= 3+5= 7+8=';
$res = preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
return $match[1] + $match[2];
}, $str);
echo $res; // va afișa '5 8 13'
?>
Rezultă că sarcina noastră este aproape rezolvată. Mai rămâne să facem astfel încât înaintea sumei să rămână subșirul căutat. Pentru aceasta vom insera înaintea sumei conținutul grupului zero:
<?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; // va afișa '2+3=5 3+5=8 7+8=13'
?>
Este dat șirul:
<?php
$str = 'The numbers are 3, 7 and 12';
?>
Înlocuiți toate numerele din șir cu pătratele lor.
Rezultatul așteptat:
'The numbers are 9, 49 and 144'
Este dat șirul:
<?php
$str = '2023-01-15 2022-12-31 2024-05-20';
?>
Transformați toate datele în formatul zi.lună.an.
Este dat șirul:
<?php
$str = 'Costs: $15, $20, $100';
?>
Măriți toate prețurile cu 10%.