Kubadilisha na Callback Kupitia Regular Expressions katika PHP
Hebu tuchukulie tuna mfuatano wa maandishi ufuatao:
<?php
$str = '2+3= 3+5= 7+8=';
?>
Hebu tuchukulie tunahitaji kupata miundo yote ya aina nambari+nambari= na kufanya hivi, baada ya ishara sawa ionekane matokeo ya kujumlisha.
Kutatua tatizo kama hilo, ni rahisi kutumia
kitendakazi preg_replace_callback, ambacho
hufanya kazi sawa na kitendakazi preg_replace
- hutafuta na kubadilisha kwa kutumia usemi wa kawaida,
lakini huruhusu kufanya michakato ya ziada
na sehemu ndogo zilizopatikana.
Kigezo cha kwanza cha kitendakazi hukubali usemi wa kawaida, cha pili - kitu cha kubadilisha nacho, cha tatu - mfuatano wa maandishi, ambao unafanyia ubadilishaji.
Wakati huo huo, kigezo cha pili kinapaswa kupitishwa kitendakazi-callback, ambacho kitaitwa kwa kila mechi iliyopatikana.
Kigezo cha kwanza cha callback kinahitaji kubainisha kigeugeu, ambacho kitapewa kilichopatikana. Kigeugeu hiki kitakuwa safu ya mfuko wa mechi iliyopatikana.
Hebu tujaribu kwa vitendo. Tuandike, msimbo, ambao utakamata sehemu ndogo zetu za maandishi, na wakati huo huo kuweka nambari ya kwanza kwenye mfuko wa kwanza, na ya pili - kwenye mfuko wa pili:
<?php
$str = '2+3= 3+5= 7+8=';
preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
var_dump($match);
}, $str);
?>
Kama matokeo, var_dump yetu
itafanya kazi
mara tatu, kikitokeza kwa mpangilio yafuatayo:
['2+3=', '2', '3']
['3+5=', '3', '5']
['7+8=', '7', '7']
Tunaendelea. Kila mechi itabadilishwa
na kile kitendakazi kinachorudisha kupitia return.
Hebu kwa mfano tubadilishe kila moja ya sehemu ndogo za maandishi zilizotafutwa
kwa alama '!':
<?php
$str = '2+3= 3+5= 7+8=';
$res = preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
return '!';
}, $str);
echo $res; // kitatokeza '! ! !'
?>
Na sasa tubadilishe kila sehemu ndogo ya maandishi kwa jumla ya nambari za jozi ndani yake:
<?php
$str = '2+3= 3+5= 7+8=';
$res = preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
return $match[1] + $match[2];
}, $str);
echo $res; // kitatokeza '5 8 13'
?>
Inafuatia kuwa, shida yetu imekaribia kutatiwa. Inabaki kufanya hivi, ili mbele ya jumla ya nambari ibaki sehemu ndogo ya maandishi iliyotafutwa. Kwa hili tutaingiza mbele ya jumla yaliyomo kwenye mfuko wa sifuri:
<?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; // kitatokeza '2+3=5 3+5=8 7+8=13'
?>
Imepewa mfuatano wa maandishi:
<?php
$str = 'The numbers are 3, 7 and 12';
?>
Badilisha nambari zote kwenye mfuatano wa maandishi kwa mraba wao.
Matokeo yanayotarajiwa:
'The numbers are 9, 49 and 144'
Imepewa mfuatano wa maandishi:
<?php
$str = '2023-01-15 2022-12-31 2024-05-20';
?>
Badilisha tarehe zote kwa umbizo siku.mwezi.mwaka.
Imepewa mfuatano wa maandishi:
<?php
$str = 'Costs: $15, $20, $100';
?>
Ongeza bei zote kwa 10%.