Zëvendësim me callback përmes regex në PHP
Le të kemi vargun e mëposhtëm:
<?php
$str = '2+3= 3+5= 7+8=';
?>
Le të themi se duhet të gjejmë të gjitha konstruksionet e formës numër+numër= dhe t'i bëjmë të tillë që pas shenjës së barazimit të shfaqet rezultati i mbledhjes.
Për të zgjidhur një problem të tillë është e përshtatshme të përdoret
funksioni preg_replace_callback, i cili
funksionon në mënyrë të ngjashme me funksionin preg_replace
- gjen dhe zëvendëson me shprehje të rregullta,
por lejon kryerjen e manipulimeve shtesë
me pjesët e gjetura.
Parametri i parë i funksionit pranon regex, i dyti - me çfarë të zëvendësohet, i treti - vargu, në të cilin kryhet zëvendësimi.
Në këtë rast, në parametrin e dytë duhet të kalohet funksioni-callback, i cili do të thirret për çdo përputhje të gjetur.
Në parametrin e parë të callback duhet të specifikohet ndryshorja në të cilën do të hyjë e gjetura. Kjo ndryshore do të jetë një array i grupeve të kapura të gjetura.
Le të provojmë në praktikë. Le të shkruajmë kod, që do të kapë nënvargjet tona, duke vendosur numrin e parë në grupin e parë, dhe të dytin - në të dytin:
<?php
$str = '2+3= 3+5= 7+8=';
preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
var_dump($match);
}, $str);
?>
Si rezultat, var_dump-i ynë
do të funksionojë
tre herë, duke shfaqur radhasi:
['2+3=', '2', '3']
['3+5=', '3', '5']
['7+8=', '7', '7']
Vazhdojmë më tej. Çdo përputhje do të zëvendësohet
me atë që kthen callback përmes return.
Le të zëvendësojmë, për shembull, secilën prej nënvargjeve të kërkuara
me shenjën '!':
<?php
$str = '2+3= 3+5= 7+8=';
$res = preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
return '!';
}, $str);
echo $res; // do të shfaqë '! ! !'
?>
Dhe tani le të zëvendësojmë çdo nënvarg me shumën e çiftit të numrave në të:
<?php
$str = '2+3= 3+5= 7+8=';
$res = preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
return $match[1] + $match[2];
}, $str);
echo $res; // do të shfaqë '5 8 13'
?>
Rezulton se detyra jonë është pothuajse e zgjidhur. Mbetet ta bëjmë të tillë që para shumës të mbetet nënvargu i kërkuar. Për këtë do të vendosim përpara shumës përmbajtjen e grupit 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; // do të shfaqë '2+3=5 3+5=8 7+8=13'
?>
Është dhënë vargu:
<?php
$str = 'The numbers are 3, 7 and 12';
?>
Zëvendësoni të gjithë numrat në varg me katrorët e tyre.
Rezultati i pritur:
'The numbers are 9, 49 and 144'
Është dhënë vargu:
<?php
$str = '2023-01-15 2022-12-31 2024-05-20';
?>
Shndërroni të gjitha datat në formatin ditë.muaj.vit.
Është dhënë vargu:
<?php
$str = 'Costs: $15, $20, $100';
?>
Rritni të gjitha çmimet me 10%.