Vervanging met 'n Callback deur middel van regex in PHP
Gestel ons het die volgende string:
<?php
$str = '2+3= 3+5= 7+8=';
?>
Gestel ons moet alle konstruksies van die vorm nommer+nommer= vind en sorg dat die resultaat van die optelling na die gelykatekens verskyn.
Om so 'n probleem op te los, is dit gerieflik om die
funksie preg_replace_callback te gebruik, wat
soortgelyk werk aan die funksie preg_replace
- dit vind en vervang volgens 'n reguliere uitdrukking,
maar dit laat addisionele manipulasies toe
met die gevinde stukke.
Die eerste parameter van die funksie is die regex, die tweede - waarmee vervang word, die derde - die string waarin die vervanging plaasvind.
In hierdie geval moet 'n callback-funksie na die tweede parameter oorgedra word, wat vir elke gevinde passing aangeroep sal word.
Die eerste parameter van die callback moet die veranderlike wees waarin die gevindes sal beland. Hierdie veranderlike sal 'n array van die gevinde groepe ("pockets") wees.
Kom ons probeer dit in die praktyk. Skryf die kode wat ons substringe sal vang, terwyl die eerste nommer in die eerste groep geplaas word, en die tweede - in die tweede groep:
<?php
$str = '2+3= 3+5= 7+8=';
preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
var_dump($match);
}, $str);
?>
As gevolg sal ons var_dump
drie keer werk,
en agtereenvolgens die volgende uitdruk:
['2+3=', '2', '3']
['3+5=', '3', '5']
['7+8=', '7', '7']
Ons gaan voort. Elke passing sal vervang word
met wat die callback terugstuur deur return.
Kom ons vervang as voorbeeld elk van die gesoekte
substringe met die teken '!':
<?php
$str = '2+3= 3+5= 7+8=';
$res = preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
return '!';
}, $str);
echo $res; // sal '! ! !' uitdruk
?>
En nou vervang ons elke substring met die som van die paar nommers daarin:
<?php
$str = '2+3= 3+5= 7+8=';
$res = preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
return $match[1] + $match[2];
}, $str);
echo $res; // sal '5 8 13' uitdruk
?>
Dit blyk dat ons taak amper opgelos is. Dit bly net om te sorg dat die substring self voor die som van die nommers bly. Om dit te doen sal ons die inhoud van die nulde groep voor die som plaas:
<?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; // sal '2+3=5 3+5=8 7+8=13' uitdruk
?>
Gegee die string:
<?php
$str = 'The numbers are 3, 7 and 12';
?>
Vervang alle nommers in die string met hul kwadrate.
Verwagte resultaat:
'The numbers are 9, 49 and 144'
Gegee die string:
<?php
$str = '2023-01-15 2022-12-31 2024-05-20';
?>
Skakel alle datums om na die formaat dag.maand.jaar.
Gegee die string:
<?php
$str = 'Costs: $15, $20, $100';
?>
Vermeerder alle pryse met 10%.