A zsebek összeszámlálásának módja a PHP reguláris kifejezéseiben

Vizsgáljuk meg a következő helyzetet. Tegyük fel, hogy van egy változónk egy évvel, amely változhat 1990 és 2099 között. Tegyük fel, hogy az év utolsó két számjegyét szeretnénk megkapni egy zsebben. Írjuk meg a megfelelő reguláris kifejezést:

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

Itt azonban vár ránk egy kellemetlenség. Az a helyzet, hogy az elmúlt század éveire a két számjegy az első zsebbe kerül, míg a második század éveire - a másodikba. Nézzük meg példákon.

Itt az első változat:

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

És itt a második változat:

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

Tegyük fel most, hogy a talált év számjegyeit egy változóba szeretnénk menteni. Probléma vár ránk, hiszen nem tudjuk pontosan, melyik kulccsal vegyük ki az adatokat a zsebből:

php<?php
  $year = $res[1]; // 1-es vagy 2-es kulcs kell
?>

A probléma megoldható feltétellel:

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

Van azonban egy egyszerűbb megoldás is. Használhatjuk a speciális (?| ) parancsot. Minden zseb, amely ezen belül van, ugyanazt a számot kapja.

Javítsuk a reguláris kifejezésünket

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

És most az évünk biztosan az egyes számú zsebben lesz:

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

Adottak dátumokat tartalmazó sztringek, amelyekben az év változhat 1990 és 2099 között:

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

Minden dátum esetén tegye a napot az első zsebbe, a hónapot a másodikba, az év utolsó két számjegyét pedig a harmadikba.