PHP-də regular ifadələr vasitəsilə callback əvəzetməsi
Tutaq ki, bizim aşağıdakı sətirimiz var:
<?php
$str = '2+3= 3+5= 7+8=';
?>
Tutaq ki, bizə rəqəm+rəqəm= şəklində olan bütün konstruksiyaları tapmaq və bərabər işarəsindən sonra toplamanın nəticəsinin görünməsini təmin etmək lazımdır.
Belə bir məsələni həll etmək üçün preg_replace_callback funksiyasından istifadə etmək rahatdır, hansı ki, preg_replace funksiyası kimi işləyir - regular ifadəyə görə tapır və əvəz edir, lakin tapılan hissəciklərlə əlavə manipulyasiyalar yerinə yetirməyə imkan verir.
Funksiya birinci parametr kimi regular ifadəni, ikinci parametr kimi nə ilə əvəz edəcəyini, üçüncü parametr kimi isə əvəzetmənin yerinə yetirildiyi sətri qəbul edir.
Bu zaman ikinci parametrə, hər bir tapılan uyğunluq üçün çağırılacaq callback funksiyası ötürülməlidir.
Callbackin birinci parametrinə, tapılanın yerləşəcəyi dəyişəni göstərmək lazımdır. Bu dəyişən tapılanın qruplarını (capture groups) ehtiva edən massiv olacaq.
Gəlin praktikada sınayaq. Birinci rəqəmi birinci qrupa, ikincini isə ikinci qrupa yerləşdirərək, bizim substringlərimizi tutacaq kodu yazaq:
<?php
$str = '2+3= 3+5= 7+8=';
preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
var_dump($match);
}, $str);
?>
Nəticədə bizim var_dump-ımız üç dəfə işləyəcək və növbə ilə aşağıdakıları çıxaracaq:
['2+3=', '2', '3']
['3+5=', '3', '5']
['7+8=', '7', '7']
Davam edək. Hər bir uyğunluq, callback tərəfindən return vasitəsilə qaytarılanla əvəz olunacaq. Gəlin misal üçün axtarılan hər bir substringi '!' işarəsi ilə əvəz edək:
<?php
$str = '2+3= 3+5= 7+8=';
$res = preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
return '!';
}, $str);
echo $res; // çıxardacaq '! ! !'
?>
İndi isə hər bir substringi onun içərisindəki cüt rəqəmlərin cəmi ilə əvəz edək:
<?php
$str = '2+3= 3+5= 7+8=';
$res = preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
return $match[1] + $match[2];
}, $str);
echo $res; // çıxardacaq '5 8 13'
?>
Belə çıxır ki, bizim məsələmiz demək olar ki, həll olunub. Qalır sadecə elə etmək ki, rəqəmlərin cəmindən əvvəl axtarılan substring qalsın. Bunun üçün cəmdən əvvəl sıfırıncı qrupun məzmununu əlavə edəcəyik:
<?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; // çıxardacaq '2+3=5 3+5=8 7+8=13'
?>
Sətir verilmişdir:
<?php
$str = 'The numbers are 3, 7 and 12';
?>
Sətirdəki bütün rəqəmləri onların kvadratları ilə əvəz edin.
Gözlənilən nəticə:
'The numbers are 9, 49 and 144'
Sətir verilmişdir:
<?php
$str = '2023-01-15 2022-12-31 2024-05-20';
?>
Bütün tarixləri gün.ay.il formatına çevirin.
Sətir verilmişdir:
<?php
$str = 'Costs: $15, $20, $100';
?>
Bütün qiymətləri 10% artırın.