Asendamine tagasikutsega regulaaravaldiste abil PHP-s
Olgu meil järgmine string:
<?php
$str = '2+3= 3+5= 7+8=';
?>
Oletame, et peame leidma kõik konstruktsioonid kujul arv+arv= ja tegema nii, et võrdusmärgi järele ilmub liitmise tulemus.
Sellise ülesande lahendamiseks on mugav kasutada
funktsiooni preg_replace_callback, mis
töötab sarnaselt funktsioonile preg_replace
- leiab ja asendab regulaaravaldise abil,
kuid võimaldab teha täiendavaid manipuleerimisi
leitud tükkidega.
Esimese parameetrina võtab funktsioon regulaaravaldise, teise - millega asendada, kolmanda - stringi, milles asendamine toimub.
Sel juhul tuleks teise parameetrina edastada tagasikutse funktsioon, mida kutsutakse välja iga leitud vastet puhul.
Tagasikutse esimeseks parameetriks tuleb määrata muutuja, kuhu leitu satub. See muutuja on massiiv leitud gruppidest (pocket).
Proovime seda praktikas. Kirjutame koodi, mis püüab meie alamstringid kinni, pannes esimese numbri esimesse gruppi ja teise - teise gruppi:
<?php
$str = '2+3= 3+5= 7+8=';
preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
var_dump($match);
}, $str);
?>
Selle tulemusena töötab meie var_dump
kolm korda, näidates järjest järgmist:
['2+3=', '2', '3']
['3+5=', '3', '5']
['7+8=', '7', '7']
Läheme edasi. Iga leitud vaste asendatakse
sellega, mida tagasikutse tagastab läbi return.
Teeme näiteks iga otsitava
alamstringi asendamise märgiga '!':
<?php
$str = '2+3= 3+5= 7+8=';
$res = preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
return '!';
}, $str);
echo $res; // väljund '! ! !'
?>
Nüüd asendame iga alamstringi numbripaari summaga:
<?php
$str = '2+3= 3+5= 7+8=';
$res = preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
return $match[1] + $match[2];
}, $str);
echo $res; // väljund '5 8 13'
?>
Selgub, et meie ülesanne on peaaegu lahendatud. Jääb teha vaid nii, et numbrite summa ees jääks alles otsitav alamstring. Selleks paneme summa ette nullindasse gruppi kuuluva sisu:
<?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; // väljund '2+3=5 3+5=8 7+8=13'
?>
Antud string:
<?php
$str = 'The numbers are 3, 7 and 12';
?>
Asendage kõik stringis olevad numbrid nende ruutudega.
Oodatav tulemus:
'The numbers are 9, 49 and 144'
Antud string:
<?php
$str = '2023-01-15 2022-12-31 2024-05-20';
?>
Teisendage kõik kuupäevad vormingusse päev.kuu.aasta.
Antud string:
<?php
$str = 'Costs: $15, $20, $100';
?>
Suurendage kõiki hindu 10% võrra.