PHP Düzenli İfadelerde Genel Cep Numarası
Aşağıdaki durumu ele alalım. Elimizde,
1990 ile 2099 arasında değişebilen
bir yıl değişkeni olduğunu varsayalım.
Yılın son iki hanesini bir cepte elde etmek
istediğimizi varsayalım. İlgili düzenli ifadeyi yazalım:
<?php
$reg = '#19(9\d)|20(\d\d)#';
?>
Ancak burada bizi bir rahatsızlık bekliyor. Mesele şu ki, geçen yüzyılın yılları için son iki hane ilk cepte, ikinci yüzyılın yılları için ise ikinci cepte olacak. Örnekler üzerinde görelim.
İşte ilk seçenek:
<?php
$str = '1991';
preg_match($reg, $str, $res);
var_dump($res); // [1 => '91']
?>
İşte ikinci seçenek:
<?php
$str = '2021';
preg_match($reg, $str, $res);
var_dump($res); // [2 => '21']
?>
Şimdi bulunan yıl hanelerini bir değişkene yazmak istediğimizi varsayalım. Bir sorunla karşılaşacağız, çünkü veriyi cepten alırken hangi anahtarı kullanacağımızı tam olarak bilmiyoruz:
<?php
$year = $res[1]; // 1 veya 2 anahtarı gerekli
?>
Sorun bir koşul ile çözülebilir:
<?php
if (!empty($res[1])){
$year = $res[1];
} else{
$year = $res[2];
}
?>
Ancak daha basit bir çözüm var.
(?| ) özel komutu kullanılabilir.
İçinde bulunan tüm cepler aynı numaraya sahip olacaktır.
Düzenli ifademizi düzeltelim
<?php
$reg = '#(?|19(9\d)|20(\d\d))#';
?>
Ve şimdi yılımız kesinlikle bir numaralı cepte olacak:
<?php
$year = $res[1];
?>
Yılı 1990 ile 2099 arasında değişebilen
tarih içeren dizeler verilmiştir:
<?php
$arr = [
'31-12-2025',
'30-11-1995',
'29-10-1990',
];
?>
Her tarih için günü birinci cepe, ayı ikinci cepe, ve yılın son iki hanesini üçüncü cepe yerleştirin.