PHP में रेगुलर एक्सप्रेशंस के माध्यम से कॉलबैक के साथ प्रतिस्थापन

मान लीजिए कि हमारे पास निम्नलिखित स्ट्रिंग है:

php<?php
  $str = '2+3= 3+5= 7+8=';
?>

मान लीजिए कि हमें संख्या+संख्या= जैसे सभी कंस्ट्रक्शन ढूंढने हैं और ऐसा करना है कि बराबर के बाद जोड़ का परिणाम दिखाई दे।

इस तरह की समस्या को हल करने के लिए preg_replace_callback फ़ंक्शन का उपयोग करना सुविधाजनक है, जो preg_replace फ़ंक्शन के समान ही काम करता है - रेगुलर एक्सप्रेशन के आधार पर ढूंढता और प्रतिस्थापित करता है, लेकिन पाए गए टुकड़ों के साथ अतिरिक्त हेरफेर करने की अनुमति देता है।

पहला पैरामीटर फ़ंक्शन रेगुलर एक्सप्रेशन स्वीकार करता है, दूसरा - किससे बदलना है, तीसरा - वह स्ट्रिंग जिसमें प्रतिस्थापन किया जाता है।

इसके साथ ही, दूसरे पैरामीटर में एक कॉलबैक फ़ंक्शन पास करना चाहिए, जिसे प्रत्येक मिलान के लिए कॉल किया जाएगा।

कॉलबैक के पहले पैरामीटर में उस वेरिएबल को निर्दिष्ट करना चाहिए जिसमें पाया गया मिलान आएगा। यह वेरिएबल पाए गए मिलान के कैप्चर ग्रुप्स की एक सरणी होगी।

आइए व्यवहार में कोशिश करते हैं। कोड लिखते हैं, जो हमारी सबस्ट्रिंग्स को पकड़ेगा, जबकि पहली संख्या को पहले कैप्चर ग्रुप में डालेगा, और दूसरी - दूसरे कैप्चर ग्रुप में:

php<?php
  $str = '2+3= 3+5= 7+8=';
  
  preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
    var_dump($match);
  }, $str);
?>

परिणामस्वरूप हमारा var_dump तीन बार काम करेगा, निम्नलिखित को एक-एक करके आउटपुट करेगा:

php['2+3=', '2', '3']
['3+5=', '3', '5']
['7+8=', '7', '7']

आगे बढ़ते हैं। प्रत्येक मिलान को उस चीज़ से बदल दिया जाएगा जो कॉलबैक return के माध्यम से वापस करता है। आइए उदाहरण के लिए खोजी गई प्रत्येक सबस्ट्रिंग को '!' चिह्न से बदलें:

php<?php
  $str = '2+3= 3+5= 7+8=';
  
  $res = preg_replace_callback('#(\d+)\+(\d+)=#', function($match) {
    return '!';
  }, $str);
  
  echo $res; // आउटपुट '! ! !'
?>

और अब प्रत्येक सबस्ट्रिंग को उसमें मौजूद संख्याओं के जोड़े के योग से बदलें:

php<?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<?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'
?>
Задание 1

एक स्ट्रिंग दी गई है:

php<?php
  $str = 'The numbers are 3, 7 and 12';
?>

स्ट्रिंग में सभी संख्याओं को उनके वर्गों से बदलें।

अपेक्षित परिणाम:

php'The numbers are 9, 49 and 144'
Задание 2

एक स्ट्रिंग दी गई है:

php<?php
  $str = '2023-01-15 2022-12-31 2024-05-20';
?>

सभी तिथियों को दिन.महीना.साल फॉर्मेट में बदलें।

Задание 3

एक स्ट्रिंग दी गई है:

php<?php
  $str = 'Costs: $15, $20, $100';
?>

सभी कीमतों में 10% की वृद्धि करें।