PHPде коллбэк аркылуу регулярдуу сөз айкаштары менен алмаштыруу
Бизде төмөнкүдөй сап бар деп коёлу:
<?php
$str = '2+3= 3+5= 7+8=';
?>
сан+сан= сыяктуу конструкциялардын бардыгын таап, тең белгиден кийин кошуунун жыйынтыгы пайда болушун камсыз кылуу керек деп коёлу.
Ушундай маселени чечүү үчүн preg_replace_callback функциясын колдонуу ыңгайлуу,
ал preg_replace функциясы сыяктуу эле иштейт
- регулярдуу туюнтма боюнча таап, алмаштырат,
бирок табылган бөлүкчөлөр менен кошумча аракеттерди жүргүзүүгө мүмкүндүк берет.
Функция биринчи параметр катары регулярдуу туюнтманы, экинчиси - эмне менен алмаштырарыбызды, үчүнчүсү - алмаштыруу жүргүзүлүүчү сапты кабыл алат.
Бул учурда экинчи параметрге ар бир табылган дал келүү үчүн чыкарыла турган коллбэк-функциясын берүү керек.
Коллбэктин биринчи параметри катары табылган нерсе түшө турган өзгөрмөнү көрсөтүү керек. Бул өзгөрмө табылгандардын кармандарынын массиви болуп көрсөтүлөт.
Келгиле, практикада сынап көрөлү. Биздин саптык бөлүктөрдү кармаган, биринчи санды биринчи карманга, экинчи санды экинчи карманга салган кодду жазалы:
<?php
$str = '2+3= 3+5= 7+8=';
preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
var_dump($match);
}, $str);
?>
Натыйжада биздин var_dump
үч жолу иштейт, кезек менен төмөнкүлөрдү чыгарат:
['2+3=', '2', '3']
['3+5=', '3', '5']
['7+8=', '7', '7']
Андан ары жылалы. Ар бир дал келүү
коллбэк тарабынан return аркылуу кайтарылган нерсе менен алмаштырылат.
Мисалы үчүн, издөөдөгү ар бир саптык бөлүктү
'!' белгиси менен алмаштыралы:
<?php
$str = '2+3= 3+5= 7+8=';
$res = preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
return '!';
}, $str);
echo $res; // '! ! !' деп чыгарат
?>
Эми ар бир саптык бөлүктү анын ичиндеги сандардын жуптарынын суммасы менен алмаштыралы:
<?php
$str = '2+3= 3+5= 7+8=';
$res = preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
return $match[1] + $match[2];
}, $str);
echo $res; // '5 8 13' деп чыгарат
?>
Биздин маселе дээрлик чечилди дегенди билдирет. Сандардын суммасынын алдында издөөдөгү саптык бөлүк калышы үчүн кылуу гана калды. Бул үчүн сумманын алдына нөлдүк кармандын мазмунун киргизебиз:
<?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; // '2+3=5 3+5=8 7+8=13' деп чыгарат
?>
Берилген сап:
<?php
$str = 'The numbers are 3, 7 and 12';
?>
Саптагы бардык сандарды алардын квадраттары менен алмаштырыңыз.
Күтүлгөн натыйжа:
'The numbers are 9, 49 and 144'
Берилген сап:
<?php
$str = '2023-01-15 2022-12-31 2024-05-20';
?>
Бардык даталарды күн.ай.жыл форматына өзгөртүңүз.
Берилген сап:
<?php
$str = 'Costs: $15, $20, $100';
?>
Бардык бааларды 10% көбөйтүңүз.