Zamenjava s povratnim klicem prek regularnih izrazov v PHP
Recimo, da imamo naslednji niz:
<?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
$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:
['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
$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
$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
$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'
?>
Dan niz:
<?php
$str = 'The numbers are 3, 7 and 12';
?>
Zamenjajte vsa števila v nizu z njihovimi kvadrati.
Pričakovan rezultat:
'The numbers are 9, 49 and 144'
Dan niz:
<?php
$str = '2023-01-15 2022-12-31 2024-05-20';
?>
Pretvorite vse datume v format dan.mesec.leto.
Dan niz:
<?php
$str = 'Costs: $15, $20, $100';
?>
Povečajte vse cene za 10%.