পিএইচপি রেগুলার এক্সপ্রেশনে কারমানোর সাধারণ নম্বর

নিম্নলিখিত পরিস্থিতি বিবেচনা করুন। ধরা যাক আমাদের একটি ভেরিয়েবল আছে যাতে বছর রয়েছে, যা 1990 থেকে 2099 পর্যন্ত পরিবর্তন হতে পারে। ধরা যাক আমরা বছরের শেষ দুটি সংখ্যা কারমানে পেতে চাই। আসুন সংশ্লিষ্ট রেগুলার এক্সপ্রেশন লিখি:

php<?php
  $reg = '#19(9\d)|20(\d\d)#';
?>

যাইহোক, এখানে একটি অসুবিধা আমাদের অপেক্ষা করছে। ব্যাপারটি হলো, বিংশ শতাব্দীর বছরের জন্য দুটি সংখ্যা প্রথম কারমানে যাবে, আর দ্বিতীয় শতাব্দীর বছরের জন্য - দ্বিতীয় কারমানে। আসুন উদাহরণে দেখি।

এখানে প্রথম বিকল্প:

php<?php
  $str = '1991';
  preg_match($reg, $str, $res);
  var_dump($res); // [1 => '91']
?>

এবং এখানে দ্বিতীয় বিকল্প:

php<?php
  $str = '2021';
  preg_match($reg, $str, $res);
  var_dump($res); // [2 => '21']
?>

ধরা যাক এখন আমরা পাওয়া বছরগুলির সংখ্যা একটি ভেরিয়েবলে লিখতে চাই। আমাদের একটি সমস্যার সম্মুখীন হতে হবে, কারণ আমরা ঠিক জানি না কোন কী দিয়ে কারমান থেকে ডেটা নিতে হবে:

php<?php
  $year = $res[1]; // 1 বা 2 কী প্রয়োজন
?>

শর্তের মাধ্যমে সমস্যাটি সমাধান করা যেতে পারে:

php<?php
  if (!empty($res[1])){
    $year = $res[1];
  } else{
    $year = $res[2];
  }
?>

যাইহোক, একটি সহজ সমাধান আছে। বিশেষ কমান্ড (?| ) ব্যবহার করা যেতে পারে। এর ভিতরে থাকা সমস্ত কারমানের একই নম্বর হবে।

আসুন আমাদের রেগুলার এক্সপ্রেশনটি সংশোধন করি

php<?php
  $reg = '#(?|19(9\d)|20(\d\d))#';
?>

এবং এখন আমাদের বছর অবশ্যই এক নম্বর কারমানে থাকবে:

php<?php
  $year = $res[1];
?>
Задание 1

তারিখ সহ স্ট্রিং দেওয়া আছে, যেখানে বছর 1990 থেকে 2099 পর্যন্ত পরিবর্তন হতে পারে:

php<?php
  $arr = [
    '31-12-2025',
    '30-11-1995',
    '29-10-1990',
  ];
?>

প্রতিটি তারিখের জন্য দিনকে প্রথম কারমানে রাখুন, মাসকে দ্বিতীয় কারমানে রাখুন, এবং বছরের শেষ দুটি সংখ্যা - তৃতীয় কারমানে রাখুন।