PHP-তে নিয়মিত এক্সপ্রেশনে নামযুক্ত গ্রুপ

ধরুন preg_match ব্যবহার করে আমরা একটি তারিখকে দিন, মাস এবং বছরে বিভক্ত করতে চাই। এর জন্য গ্রুপ ব্যবহার করা যাক:

php<?php
  $str = '2025-10-29';
  $reg = '#(\d{4})-(\d{2})-(\d{2})#';
  
  preg_match($reg, $str, $match);
  var_dump($match); // আউটপুট দেবে ['2025-10-29', '2025', '10', '29']
?>

আপনি দেখতে পাচ্ছেন, ফলাফল হিসেবে আমরা একটি অ্যারে পাই, যার শূন্য ইনডেক্সে সম্পূর্ণ তারিখটি থাকে, প্রথম ইনডেক্সে - বছর, দ্বিতীয়টিতে - মাস, তৃতীয়টিতে - দিন।

যাইহোক, মাঝে মাঝে গ্রুপের বিষয়বস্তুটি একটি অ্যাসোসিয়েটিভ অ্যারে হিসাবে পাওয়া সুবিধাজনক হবে। অর্থাৎ আমাদের ক্ষেত্রে এইরকম একটি অ্যারে পাওয়া ভালো হবে:

php[
  'year'  => '2025',
  'month' => '10',
  'day'   => '29'
]

এই জন্য নিয়মিত এক্সপ্রেশনে একটি বিশেষ সিনট্যাক্স আছে। এটি হলো: (?<name>pattern), যেখানে pattern হলো নিয়মিত এক্সপ্রেশন, এবং name হলো গ্রুপের নাম।

আসুন নামযুক্ত গ্রুপ ব্যবহার করে তারিখের জন্য আমাদের নিয়মিত এক্সপ্রেশনটি আবার লিখি:

php<?php
  $str = '2025-10-29';
  $reg = '#(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})#';
  
  preg_match($reg, $str, $match);
  var_dump($match);
?>

ফলস্বরূপ, আমরা একটি অ্যাসোসিয়েটিভ অ্যারে পাব, যার কীগুলি হবে গ্রুপের নাম, এবং মানগুলি হবে সেগুলিতে যা পড়েছে:

php[
  'year'  => '2025',
  'month' => '10',
  'day'   => '29',
]

আসলে, ফলাফলের অ্যারেতে গ্রুপের মানগুলি নাম এবং ক্রমিক নম্বর উভয় দ্বারাই অ্যাক্সেস করা যাবে। অর্থাৎ, উদাহরণস্বরূপ, বছর 'year' কী দ্বারা এবং 1 নম্বর দ্বারা অ্যাক্সেস করা যাবে, মাস - 'month' কী দ্বারা এবং 2 নম্বর দ্বারা এবং এভাবেই চলবে:

php[
  'year'  => '2025',
  'month' => '10',
  'day'   => '29',
  
  1       => '2025',
  2       => '10',
  3       => '29'
]

বর্ণিত নামযুক্ত গ্রুপগুলির আরও কয়েকটি বিকল্প সিনট্যাক্স রয়েছে: (?P<name>pattern) এবং (?'name'pattern)।

Задание 1

একটি সময় সহ একটি স্ট্রিং দেওয়া আছে:

php<?php
  $str = '12:59:59';
?>

ঘন্টা, মিনিট এবং সেকেন্ড আলাদা আলাদা নামযুক্ত গ্রুপে রাখুন।

Задание 2

একটি ফাংশন লিখুন, যা ফলাফলের অ্যারেতে সমস্ত সংখ্যাযুক্ত গ্রুপ মুছে দেবে, শুধুমাত্র নামযুক্ত গ্রুপগুলি রেখে দেবে।