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%-ით.