পিএইচপিতে রেগুলার এক্সপ্রেশনের লোভ সীমিত করা
রেগুলার এক্সপ্রেশন ডিফল্টরূপে লোভী। এর মানে হল তারা সর্বাধিক সম্ভাব্য সংখ্যক অক্ষর ক্যাপচার করে।
আসুন একটি উদাহরণ দিয়ে বুঝুন। ধরুন আমাদের কাছে এইরকম একটি স্ট্রিং আছে:
php<?php
$str = 'aeeex zzz x kkk';
?>
ধরুন আমরা এই স্ট্রিংটিতে সাবস্ট্রিং 'aeeex' খুঁজে পেতে চাই নিম্নলিখিত প্যাটার্ন অনুসারে: অক্ষর
'a', তারপর যেকোনো অক্ষর এক বা একাধিক বার, তারপর অক্ষর 'x'।
php<?php
$res = preg_replace('#a.+x#', '!', $str);
?>
আমরা আশা করি যে ফলস্বরূপ ভেরিয়েবলে '! zzz x kkk' স্ট্রিংটি লেখা হবে। যাইহোক,
এটি এমন নয় - ভেরিয়েবলে '! kkk' স্ট্রিংটি পাওয়া যায়।
সমস্যা হল যে আমাদের রেগুলার এক্সপ্রেশন 'a' অক্ষর থেকে 'x' অক্ষর পর্যন্ত সমস্ত অক্ষর খুঁজে বের করে।
কিন্তু আমাদের স্ট্রিংয়ে দুটি 'x' অক্ষর আছে। লোভের কারণে এটি দেখা যাচ্ছে যে রেগুলার এক্সপ্রেশন শেষ 'x' পর্যন্ত খোঁজ করে, যার ফলে এটি আমাদের প্রত্যাশার চেয়ে বেশি ক্যাপচার করে।
অবশ্যই, অনেক ক্ষেত্রে এই আচরণই আমাদের দরকার।
কিন্তু এই বিশেষ ক্ষেত্রে আমরা লোভ বাতিল করতে এবং রেগুলার এক্সপ্রেশনটিকে প্রথম 'x' পর্যন্ত খুঁজে পেতে বলতে চাই।
লোভ সীমিত করতে, পুনরাবৃত্তি অপারেটরের পরে একটি প্রশ্ন চিহ্ন রাখতে হবে:
php<?php
$res = preg_replace('#a.+?x#', '!', $str);
?>
সমস্ত পুনরাবৃত্তি অপারেটরের লোভ সীমিত করা যেতে পারে, এভাবে: *?, ??
এবং {}?।
একটি স্ট্রিং দেওয়া হয়েছে:
php<?php
$str = 'aba accca azzza wwwwa';
?>
একটি রেগুলার এক্সপ্রেশন লিখুন যা 'a' অক্ষর দ্বারা সীমাবদ্ধ সমস্ত স্ট্রিং খুঁজে পাবে এবং তাদের প্রতিটিকে '!' দিয়ে প্রতিস্থাপন করবে। 'a' অক্ষর দুটির মধ্যে যেকোনো অক্ষর ('a' ছাড়া) থাকতে পারে।