PHP-তে রেগুলার এক্সপ্রেশনের মাধ্যমে কলব্যাক সহ প্রতিস্থাপন
ধরা যাক আমাদের নিম্নলিখিত স্ট্রিংটি আছে:
<?php
$str = '2+3= 3+5= 7+8=';
?>
ধরা যাক আমাদের number+number= ফরম্যাটের সমস্ত কনস্ট্রাকশন খুঁজে বের করতে হবে এবং এমন করতে হবে যাতে সমানের পরে যোগের ফলাফল দেখা যায়।
এই ধরনের সমস্যা সমাধানের জন্য 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% বৃদ্ধি করুন।