PHP रेगुलर एक्सप्रेशन में पॉकेट्स की कुल संख्या

निम्नलिखित स्थिति पर विचार करें। मान लीजिए कि हमारे पास एक वर्ष के साथ एक चर है, जो 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',
  ];
?>

प्रत्येक तारीख के लिए दिन को पहले पॉकेट में रखें, महीने को दूसरे में, और वर्ष के अंतिम दो अंक - तीसरे में।