Nombor Am Pockets dalam Regex PHP
Pertimbangkan situasi berikut. Katakan kita
mempunyai pembolehubah dengan tahun, yang boleh berubah
dari 1990 hingga 2099.
Katakan kita ingin mendapatkan dua digit terakhir
tahun dalam pocket. Mari tulis regex yang sepadan:
<?php
$reg = '#19(9\d)|20(\d\d)#';
?>
Walau bagaimanapun, satu ketidakselesaan menanti kita di sini. Masalahnya ialah untuk abad yang lalu, dua digit akan masuk ke pocket pertama, manakala untuk abad kedua - ke pocket kedua. Mari lihat dengan contoh.
Ini ialah varian pertama:
<?php
$str = '1991';
preg_match($reg, $str, $res);
var_dump($res); // [1 => '91']
?>
Dan ini ialah varian kedua:
<?php
$str = '2021';
preg_match($reg, $str, $res);
var_dump($res); // [2 => '21']
?>
Sekarang katakan kita ingin menulis digit tahun yang ditemui ke dalam pembolehubah. Kita akan menghadapi masalah, kerana kita tidak tahu dengan tepat kunci mana untuk mengambil data dari pocket:
<?php
$year = $res[1]; // perlukan kunci sama ada 1, atau 2
?>
Masalah boleh diselesaikan dengan syarat:
<?php
if (!empty($res[1])){
$year = $res[1];
} else{
$year = $res[2];
}
?>
Walau bagaimanapun, terdapat penyelesaian yang lebih mudah. Boleh gunakan
perintah khas (?| ). Semua pocket
yang berada di dalamnya akan mempunyai
satu nombor.
Mari betulkan regex kami
<?php
$reg = '#(?|19(9\d)|20(\d\d))#';
?>
Dan sekarang tahun kami pasti akan berada dalam pocket nombor satu:
<?php
$year = $res[1];
?>
Diberi rentetan dengan tarikh, di mana tahun boleh
berubah dari 1990 hingga 2099:
<?php
$arr = [
'31-12-2025',
'30-11-1995',
'29-10-1990',
];
?>
Untuk setiap tarikh, letakkan hari dalam pocket pertama, bulan dalam pocket kedua, dan dua digit terakhir tahun - dalam pocket ketiga.