Saya mencoba untuk memeriksa bahwa tanggal yang dimasukkan oleh pengguna akhir adalah dalam YYYY-MM-DD. Regex tidak pernah menjadi kekuatan saya, saya terus mendapatkan nilai pengembalian palsu untuk preg_match () yang saya siapkan.
Jadi saya berasumsi saya telah mengacaukan regex, yang dijelaskan di bawah ini.
$date="2012-09-12";
if (preg_match("^[0-9]{4}-[0-1][0-9]-[0-3][0-9]$",$date))
{
return true;
}else{
return false;
}
Ada pemikiran?
php
regex
date-format
cosmicsafari
sumber
sumber
date("Y-m-d", strtotime("2012-09-12"))=="2012-09-12";
atau PHPcheckdate ( int $month , int $day , int $year )
.Jawaban:
Coba ini.
sumber
return (bool)preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/",$date);
Mungkin lebih baik menggunakan mekanisme lain untuk ini.
Solusi modern, dengan
DateTime
:Ini juga memvalidasi masukan:
$dt !== false
memastikan bahwa tanggal dapat diuraikan dengan format yang ditentukan danarray_sum
triknya adalah cara singkat untuk memastikan bahwa PHP tidak melakukan "pergeseran bulan" (misalnya, pertimbangkan bahwa 32 Januari adalah 1 Februari). LihatDateTime::getLastErrors()
untuk informasi lebih lanjut.Solusi jadul dengan
explode
dancheckdate
:Ini memvalidasi bahwa input adalah tanggal yang valid juga. Anda dapat melakukannya dengan regex tentu saja, tetapi ini akan menjadi lebih merepotkan - dan 29 Februari tidak dapat divalidasi dengan regex sama sekali.
Kelemahan dari pendekatan ini adalah Anda harus sangat berhati-hati untuk menolak semua kemungkinan input "buruk" sambil tidak mengeluarkan pemberitahuan dalam keadaan apa pun. Begini caranya:
explode
dibatasi untuk mengembalikan 3 token (sehingga jika masukannya adalah "1-2-3-4",$d
akan menjadi "3-4")ctype_digit
digunakan untuk memastikan bahwa input tidak berisi karakter non-numerik (selain tanda hubung)array_pad
digunakan (dengan nilai default yang akan menyebabkancheckdate
kegagalan) untuk memastikan bahwa cukup banyak elemen yang dikembalikan sehingga jika inputnya adalah "1-2"list()
tidak akan mengeluarkan pemberitahuansumber
DateTime
dan tidak pernah mendengar tentangcheckdate
... memalukan saya.DateTime
juga bisa melakukan ini. Saya baru saja menyelesaikan jawabannya, lihat lagi jika Anda mau.getLastErrors
?tttt-bb-hh:
/^((((19|[2-9]\d)\d{2})\-(0[13578]|1[02])\-(0[1-9]|[12]\d|3[01]))|(((19|[2-9]\d)\d{2})\-(0[13456789]|1[012])\-(0[1-9]|[12]\d|30))|(((19|[2-9]\d)\d{2})\-02\-(0[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))\-02\-29))$/g
tttt / bb / hh:
/^((((19|[2-9]\d)\d{2})\/(0[13578]|1[02])\/(0[1-9]|[12]\d|3[01]))|(((19|[2-9]\d)\d{2})\/(0[13456789]|1[012])\/(0[1-9]|[12]\d|30))|(((19|[2-9]\d)\d{2})\/02\/(0[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))\/02\/29))$/g
bb-hh-tttt:
/^(((0[13578]|1[02])\-(0[1-9]|[12]\d|3[01])\-((19|[2-9]\d)\d{2}))|((0[13456789]|1[012])\-(0[1-9]|[12]\d|30)\-((19|[2-9]\d)\d{2}))|(02\-(0[1-9]|1\d|2[0-8])\-((19|[2-9]\d)\d{2}))|(02\-29\-((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/g
bb / hh / tttt:
/^(((0[13578]|1[02])\/(0[1-9]|[12]\d|3[01])\/((19|[2-9]\d)\d{2}))|((0[13456789]|1[012])\/(0[1-9]|[12]\d|30)\/((19|[2-9]\d)\d{2}))|(02\/(0[1-9]|1\d|2[0-8])\/((19|[2-9]\d)\d{2}))|(02\/29\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/g
hh / bb / tttt:
/^(((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((19|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((19|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\/02\/((19|[2-9]\d)\d{2}))|(29\/02\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/g
hh-bb-tttt:
/^(((0[1-9]|[12]\d|3[01])\-(0[13578]|1[02])\-((19|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\-(0[13456789]|1[012])\-((19|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\-02\-((19|[2-9]\d)\d{2}))|(29\-02\-((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/g
sumber
Kriteria:
Setiap tahun habis dibagi 4 adalah tahun kabisat, kecuali jika habis habis 100 kecuali habis habis 400. Jadi:
Februari memiliki 29 hari sebagai tahun kabisat dan 28 hari sebagai tahun kabisat
30 hari pada bulan April, Juni, September dan November
31 hari di bulan Januari, Maret, Mei, Juli, Agustus, Oktober dan Desember
Uji:
Semua tanggal berikut harus lulus validasi:
Tanggal-tanggal berikut ini harusnya semua gagal validasi:
Jarak:
Kami akan menguji untuk tanggal dari 1 Jan 1000 hingga 31 Des 2999. Secara teknis, kalender Gregorian yang saat ini digunakan hanya mulai digunakan pada 1753 untuk Kerajaan Inggris dan pada berbagai tahun pada 1600-an untuk negara-negara di Eropa, tetapi saya tidak akan melakukannya khawatir tentang itu.
Regex untuk menguji tahun kabisat:
Tahun-tahun yang habis dibagi 400:
Tahun-tahun yang habis dibagi 4:
Tahun-tahun yang habis dibagi 100:
Tidak habis dibagi 100:
Tahun-tahun yang habis dibagi 100 tetapi tidak habis dibagi 400:
Dapat dibagi 4 tetapi tidak dibagi 100:
Tahun kabisat:
Tidak habis dibagi 4:
Bukan tahun kabisat:
Bulan dan hari yang valid kecuali Februari (MM-DD):
Februari dengan 28 hari:
Februari dengan 29 hari:
Tanggal berlaku:
Jadi begitulah regex untuk tanggal antara 1 Jan 1000 dan 31 Des 2999 dalam format YYYY-MM-DD.
Saya kira ini bisa dipersingkat, tapi saya serahkan pada orang lain.
Itu akan cocok dengan semua tanggal yang valid. Jika Anda ingin itu hanya berlaku ketika itu hanya berisi satu tanggal dan tidak ada yang lain, maka bungkuslah
^( )$
seperti ini:Jika Anda menginginkannya untuk entri tanggal opsional (misalnya dapat dikosongkan atau tanggal yang valid) kemudian tambahkan
^$|
di awal, seperti ini:sumber
Anda bisa membuatnya seperti ini:
tetapi Anda sebaiknya menggunakan yang ini:
dalam hal ini Anda akan mendapatkan objek yang lebih mudah digunakan daripada string.
sumber
0175-44-19927
akan lulus.Saya tahu ini pertanyaan lama. Tapi saya rasa saya punya solusi yang bagus.
Kamu bisa mencobanya. Jika Anda mengubah tanggal menjadi 21.02.2016 gema tersebut salah. Dan jika Anda mengubah format setelah itu menjadi dmY echo benar.
Dengan kode mudah ini, Anda seharusnya dapat memeriksa format tanggal mana yang digunakan tanpa memeriksanya dengan regex.
Mungkin ada orang yang akan mengujinya di setiap kasus. Tapi saya pikir ide saya secara umum valid. Bagi saya ini sepertinya logis.
sumber
Anda dapat menggunakan preg_match dengan fungsi php checkdate
sumber
preg_match membutuhkan / atau karakter lain sebagai pembatas.
Anda juga harus memeriksa validitas tanggal tersebut sehingga Anda tidak akan mendapatkan sesuatu seperti 9999-19-38
sumber
Anda juga bisa melakukannya seperti ini:
Ini tidak hanya akan memeriksa format, tetapi juga validitas tanggal itu sendiri, karena
DateTime
hanya akan membuat tanggal yang valid dan ini harus cocok dengan masukan.sumber
kamu bisa memakai
sumber
Periksa dan validasi
YYYY-MM-DD
tanggal dalam satu baris pernyataanOutputnya adalah:
Hari dan bulan tanpa awalan nol diperbolehkan. Jika Anda tidak ingin mengizinkan ini, regexp harus:
sumber
Jika Anda ingin mencocokkan jenis tanggal itu, gunakan:
sumber
Ini akan memberi tahu Anda jika formatnya valid dan jika tanggal input valid.
sumber
Jika ada bantuan, berikut adalah regex untuk format jnY (tahun harus lebih besar dari 2018):
sumber
sumber
Mungkin berguna bagi seseorang:
sumber
'1996-11-31 24:00'); // true
, Betulkah? Selain itu, terkadang ada 61 detik dalam satu menit, lihat: en.wikipedia.org/wiki/Leap_secondFungsi untuk memvalidasi format tanggal umum:
Contoh eksekusi:
sumber
Itu semua tergantung pada seberapa ketat Anda menginginkan fungsi ini. Misalnya, jika Anda tidak ingin mengizinkan bulan di atas 12 dan hari di atas 31 (tidak bergantung pada bulannya, itu akan memerlukan penulisan logika tanggal), ini bisa menjadi sangat rumit:
Secara pribadi saya hanya akan pergi untuk:
/^([0-9]{4}\-([0-9]{2}\-[0-9]{2})$/
sumber
0[1-9]|1[0-2]
mencocokkan bulan 01-12 dan0[1-9]|[12][0-9]|3[01]
mencocokkan hari 01-31.Untuk bekerja dengan tanggal di php Anda harus mengikuti standar php sehingga regex yang diberikan akan memastikan bahwa Anda memiliki tanggal yang valid yang dapat beroperasi dengan PHP.
sumber
1980-01-01
tetapi akan cocok2100-02-29
Metode ini dapat berguna untuk memvalidasi tanggal dalam PHP. Metode saat ini adalah untuk format bb / hh / tttt. Anda harus memperbarui urutan parameter di checkdate sesuai format Anda dan pembatas di meledak .
sumber
[Jika Anda menggunakan Symfony 4.1.2 coba ini] [1]
sumber
Dari Laravel 5.7 dan format tanggal yaitu: 12/31/2019
sumber
Saya sedang mencari "cara memvalidasi tanggal" dan menemukan solusi ini, Ini lama tetapi saya akan membagikan metode di bawah ini yang dapat digunakan untuk memvalidasi tanggal di php,
sumber