PHP Dinamik Düzenli ifade?

1 Cevap php

Ben düzenli ifadeler relativly yeniyim ama (artık yıl olmadan, ve insanlar bir ay boyunca geçerli 30 veya 31 rakamını girin varsayarak) tarihlerini doğrulamak için çalışan bir ifadesi oluşturmak için başardı.

This is the expressen: /^\d[1-31]{2}\-\d[1-12]{2}\-\d[1900-2009]{4}$/

Ama ben gibi dinamik bir düzenli ifade var istiyorum:

$yearSpan = (date("Y") - 110)."-".date("Y");
/^\d[1-31]{2}\-\d[1-12]{2}\-\d[$yearSpan]{4}$/

Ben bu ifadeyi kullanmaya çalıştığınızda bana derleme söylüyorum tutar başarısız oldu, çünkü karakter sınıfında sıra dışı bir dizi.

Ben doğum tarihlerini doğrulamak için bu ifadeyi kullanıyorum, ve bunu güncellemek için değil bir yıl geçen her zaman güzel olurdu.

Herhangi bir öneriniz?

1 Cevap

Ben bu amaç için bazı tarih / zaman işlevleri kullanmayı düşünmelisiniz düşünüyorum.

Sen yanlış bir şekilde karakter sınıfları kullanarak ediyoruz. [1-31], [1-12] ve [1900-2009] onlara sahip aralıkları kontrol etmeyecek. O değil nasıl character classes çalışmak ve dolayısıyla size regex numeric ranges kontrol nasıl değil.

Bir karakter sınıfı [a-r] r için a herhangi bir karakter ile eşleşir. [a-rx] r için a herhangi bir karakterle eşleşir ve karakter x. Benzer şekilde, [1-39] 3 için 1 herhangi bir karakterle eşleşir ve karakter 9 - dolayısıyla 1,2,3 birini maçları 9 - ve değil onu amaçlandığı gibi 1-39 herhangi bir sayı.

33 geçerli bir maç - [1-31]{2} aralığı 1 ila 3 her iki ardışık sayılar (son 1 gereksiz), eşleşir.

1-31 bir dizi maç için, doğru regex olan 0?[1-9]|[1-2][0-9]|3[0-1]. ('0? "01-09-2009 olarak sıfır padding önemser

Aylarca: 0?[1-9]|1[0-2]

Yıl: 19[0-9]{2}|200[0-9]

Ve - karakter sınıfları dışında bir meta karakter değil - bunu kaçmak gerekmez.

Doğru regex olacaktır:

/^(0?[1-9]|[1-2][0-9]|3[0-1])-(0?[1-9]|1[0-2])-(19[0-9]{2}|200[0-9])$/

: Eğer değerlerini yakalayan ilgilenen değilseniz, siz yazabilirsiniz

/^(?:0?[1-9]|[1-2][0-9]|3[0-1])-(?:0?[1-9]|1[0-2])-(?:19[0-9]{2}|200[0-9])$/