PHPda regex orqali callback bilan almashtirish
Faraz qilaylik, bizda quyidagi qator mavjud:
<?php
$str = '2+3= 3+5= 7+8=';
?>
Faraz qilaylik, biz son+son= ko'rinishidagi barcha konstruksiyalarni topishimiz va teng belgisidan keyin qo'shish natijasi paydo bo'lishini ta'minlashimiz kerak.
Bunday masalani yechish uchun preg_replace_callback funktsiyasidan foydalanish qulay, bu funktsiya preg_replace funktsiyasiga o'xshaydi - regex orqali topadi va almashtiradi, lekin topilgan qismlar bilan qo'shimcha manipulyatsiyalarni bajarishga imkon beradi.
Funktsiya birinchi parametr sifatida regex qabul qiladi, ikkinchisi - nima bilan almashtirish, uchinchisi - almashtirish amalga oshiriladigan qator.
Bunda ikkinchi parametrga har bir topilgan moslik uchun chaqiriladigan callback funktsiyasini uzatish kerak.
Callbackning birinchi parametrida topilgan narsaning tushadigan o'zgaruvchini ko'rsatish kerak. Bu o'zgaruvchi topilganlarning qoplamalar massivi sifatida taqdim etiladi.
Keling, amaliyotda sinab ko'raylik. Bizning qatorlarni ushlaydigan, shu bilan birga birinchi sonni birinchi qoplamaga, ikkinchisini esa ikkinchi qoplamaga qo'yadigan kod yozamiz:
<?php
$str = '2+3= 3+5= 7+8=';
preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
var_dump($match);
}, $str);
?>
Natijada bizning var_dumpimiz uch marta ishlaydi va navbatma-navbat quyidagilarni chiqaradi:
['2+3=', '2', '3']
['3+5=', '3', '5']
['7+8=', '7', '7']
Davom etamiz. Har bir moslik return orqali callback qaytargan narsa bilan almashtiriladi. Keling, misol uchun har bir qidirilgan qatorni '!' belgisi bilan almashtiramiz:
<?php
$str = '2+3= 3+5= 7+8=';
$res = preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
return '!';
}, $str);
echo $res; // chiqaradi '! ! !'
?>
Endi har bir qatorni undagi juft sonlar yig'indisi bilan almashtiramiz:
<?php
$str = '2+3= 3+5= 7+8=';
$res = preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
return $match[1] + $match[2];
}, $str);
echo $res; // chiqaradi '5 8 13'
?>
Ma'lum bo'ladiki, bizning vazifamiz deyarli bajarildi. Faqat sonlar yig'indisidan oldin qidirilgan qatorning o'zi qolishini ta'minlash kerak. Buning uchun yig'indidan oldin nolinchi qoplamaning tarkibini kiritamiz:
<?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; // chiqaradi '2+3=5 3+5=8 7+8=13'
?>
Berilgan qator:
<?php
$str = 'The numbers are 3, 7 and 12';
?>
Qatordagi barcha sonlarni ularning kvadratlari bilan almashtiring.
Kutilayotgan natija:
'The numbers are 9, 49 and 144'
Berilgan qator:
<?php
$str = '2023-01-15 2022-12-31 2024-05-20';
?>
Barcha sanalarni kun.oy.yil formatiga o'zgartiring.
Berilgan qator:
<?php
$str = 'Costs: $15, $20, $100';
?>
Barcha narxlarni 10% ga oshiring.