PHPда регулярки орқали коллбэк билан алмаштириш
Фарз қилайлик, бизда куйидаги қатор мавжуд:
<?php
$str = '2+3= 3+5= 7+8=';
?>
Фарз қилайлик, бизга рақам+рақам= курилишидаги барча конструкцияларни топиш ва ушлаб қолиш керак, шуңға ўхшаш қилиб, тенглик ишорасидан кейин қўшиш натижаси пайдо бўлсин.
Бундай масалани ечиш учун preg_replace_callback функциясидан фойдаланиш қулай,
бу функция preg_replace функциясига ўхшаш ишлайди
- регуляр ифода бўйича топади ва алмаштиради,
лекин топилган бўлаклар билан қўшимча манипуляциялар бажаришга имкон беради.
Биринчи параметр сифатида функция регуляркани қабул қилади, иккинчиси - нимага алмаштирамиз, учинчиси - алмаштириш амалга ошириладиган қатор.
Бу ҳолда иккинчи параметрга коллбэк-функция ўтказилиши керак, у ҳар бир топилган мослик учун чақирилади.
Коллбэкнинг биринчи параметри сифатида топилган нарса тушадigan ўзгаргувчини кўрсатиш керак. Бу ўзгаргувчи топилганнинг карманлари массиви бўлади.
Келинг, амалиётда синab кўрамиз. Код ёзамиз, у бизнинг қисма қаторларимизни ушлаб қолади, бу ҳолда биринчи рақамни биринчи карманга, иккинчисини - иккинчи карманга қўйиб:
<?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; // чиқади '! ! !'
?>
Энди ҳар бир қисма қаторни ундагі juft рақамлар йиғиндисига алмаштирамиз:
<?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% га оширинг.