Zamenjava s povratnim klicem prek regularnih izrazov v PHP

Recimo, da imamo naslednji niz:

php<?php
  $str = '2+3= 3+5= 7+8=';
?>

Recimo, da moramo najti vse konstrukcije oblike število+število= in narediti tako, da se za enačajem pojavi rezultat seštevanja.

Za rešitev takšnega problema je priročno uporabiti funkcijo preg_replace_callback, ki deluje podobno kot funkcija preg_replace - najde in zamenja z regularnim izrazom, vendar omogoča izvajanje dodatnih manipulacij z najdenimi deli.

Prvi parameter funkcije sprejme regularni izraz, drugi - s čim zamenjamo, tretji - niz, v katerem se izvaja zamenjava.

Poleg tega je treba v drugi parameter posredovati funkcijo povratnega klica, ki bo poklicana za vsako najdeno ujemanje.

Kot prvi parameter povratnega klica je treba določiti spremenljivko, v katero bo prišlo najdeno. Ta spremenljivka bo predstavljala matriko zajetih skupin najdenega.

Poskusimo v praksi. Napišimo kodo, ki bo ujela naše podnize, pri tem pa bo prvo število postavila v prvo skupino, drugo - v drugo:

php<?php
  $str = '2+3= 3+5= 7+8=';
  
  preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
    var_dump($match);
  }, $str);
?>

Kot rezultat bo naš var_dump deloval trikrat in zaporedoma izpisal naslednje:

php['2+3=', '2', '3']
['3+5=', '3', '5']
['7+8=', '7', '7']

Gremo naprej. Vsako ujemanje bo zamenjano s tem, kar povratni klic vrne prek return. Za primer zamenjajmo vsakega od iskanih podnizov z znakom '!':

php<?php
  $str = '2+3= 3+5= 7+8=';
  
  $res = preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
    return '!';
  }, $str);
  
  echo $res; // izpiše '! ! !'
?>

Zdaj pa zamenjajmo vsak podniz z vsoto para števil v njem:

php<?php
  $str = '2+3= 3+5= 7+8=';
  
  $res = preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
    return $match[1] + $match[2];
  }, $str);
  
  echo $res; // izpiše '5 8 13'
?>

Izkazalo se je, da je naša naloga skoraj rešena. Ostalo je še narediti tako, da pred vsoto števil ostane iskani podniz. Za to bomo pred vsoto vstavili vsebino ničelne skupine:

php<?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; // izpiše '2+3=5 3+5=8 7+8=13'
?>
Задание 1

Dan niz:

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

Zamenjajte vsa števila v nizu z njihovimi kvadrati.

Pričakovan rezultat:

php'The numbers are 9, 49 and 144'
Задание 2

Dan niz:

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

Pretvorite vse datume v format dan.mesec.leto.

Задание 3

Dan niz:

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

Povečajte vse cene za 10%.