Aizstāšana ar atzvanījuma funkciju regulārajās izteiksmēs PHP
Pieņemsim, ka mums ir šāda virkne:
<?php
$str = '2+3= 3+5= 7+8=';
?>
Pieņemsim, ka mums ir jāatrod visas konstrukcijas, kuras izskatās kā skaitlis+skaitlis= un jāpanāk, ka pēc vienādības zīmes parādās saskaitīšanas rezultāts.
Lai atrisinātu šādu uzdevumu, ir ērti izmantot
funkciju preg_replace_callback, kas
strādā līdzīgi kā funkcija preg_replace
- atrod un aizstāj ar regulāro izteiksmi,
bet ļauj veikt papildu manipulācijas
ar atrastajām daļiņām.
Pirmo parametru funkcija pieņem regulāro izteiksmi, otro - ar ko aizstājam, trešo - virkni, kurā tiek veikta aizstāšana.
Šajā gadījumā otrajā parametrā vajadzētu padot atzvanījuma funkciju, kas tiks izsaukta katram atrastajam atbilstībam.
Pirmajam atzvanījuma funkcijas parametram jānorāda mainīgais, kurā nonāks atrastais. Šis mainīgais būs atrasto atbilstību apakšgrupu masīvs.
Izmēģināsim praksē. Uzrakstīsim kodu, kurs noķers mūsu apakšvirknes, vienlaikus ieliekot pirmo skaitli pirmajā apakšgrupā, bet otro - otrajā:
<?php
$str = '2+3= 3+5= 7+8=';
preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
var_dump($match);
}, $str);
?>
Rezultātā mūsu var_dump nostrādās
trīs reizes, pēc kārtas izvadot sekojošo:
['2+3=', '2', '3']
['3+5=', '3', '5']
['7+8=', '7', '7']
Ejam tālāk. Katra atbilstība tiks aizstāta
ar to, ko atzvanījuma funkcija atgriež ar return.
Piemēram, aizstāsim katru no meklētajām
apakšvirknēm ar zīmi '!':
<?php
$str = '2+3= 3+5= 7+8=';
$res = preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
return '!';
}, $str);
echo $res; // izvadīs '! ! !'
?>
Un tagad aizstāsim katru apakšvirkni ar skaitļu pāra summu tajā:
<?php
$str = '2+3= 3+5= 7+8=';
$res = preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
return $match[1] + $match[2];
}, $str);
echo $res; // izvadīs '5 8 13'
?>
Izrādās, ka mūsu uzdevums ir gandrīz atrisināts. Atliek tikai panākt, ka pirms skaitļu summas paliek meklētā apakšvirkne. Lai to izdarītu, ievietosim pirms summas nulles apakšgrupas saturu:
<?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; // izvadīs '2+3=5 3+5=8 7+8=13'
?>
Dota virkne:
<?php
$str = 'The numbers are 3, 7 and 12';
?>
Aizstājiet visus skaitļus virknē ar to kvadrātiem.
Gaidāmais rezultāts:
'The numbers are 9, 49 and 144'
Dota virkne:
<?php
$str = '2023-01-15 2022-12-31 2024-05-20';
?>
Pārveidojiet visus datumus formātā diena.mēnesis.gads.
Dota virkne:
<?php
$str = 'Costs: $15, $20, $100';
?>
Palieliniet visas cenas par 10%.