تعبير منتظم لمطابقة التواريخ في تنسيق YYYY-MM-DD
-
19-09-2019 - |
سؤال
لدي تعبير منتظم في PHP الذي يبحث عن التاريخ بتنسيق YYYY-MM-DD
ما لدي هو: [\d]{4}-[\d]{2}-[\d]{2}
أنا أستخدم Preg_Match لاختبار التاريخ، المشكلة هي أن 2009-11-10
يعمل، ولكن 2009-11-1033434
يعمل كذلك. لقد كانت لحظة منذ أن قمت بإعادة ترجكس، كيف يمكنني التأكد من أنها تتوقف عند المكان الصحيح؟ لقد حاولت القيام به /([\d]{4}-[\d]{2}-[\d]{2}){1}/
, ، لكنه يعود نفس النتيجة.
سيتم تقدير أي مساعدة إلى حد كبير.
المحلول
ما تحتاجه هو المراسيات، وتحديدا ^
و $
. وبعد السابق يطابق بداية السلسلة، وهذا الأخير يطابق النهاية.
النقطة الأخرى التي سأجعلها هي []
غير ضرورية. \d
يحتفظ بمعنىها خارج نطاقات الشخصية.
لذلك يجب أن تبدو Regex الخاصة بك مثل هذا: /^\d{4}-\d{2}-\d{2}$/
.
نصائح أخرى
كيف تتوقع أن يتم إنهاء تاريخك؟
إذا كان نهاية الخط، ثم التالي $
يجب أن تفعل الخدعة.
إذا بواسطة حرف غير رقمي، ثم سلبية التالية تأكيد (?!\d)
سوف تعمل بالمثل.
^20[0-2][0-9]-((0[1-9])|(1[0-2]))-([0-2][1-9]|3[0-1])$
أضفت تفحص إضافي قليلا للمساعدة في قضية MM
و DD
الحصول على مختلطة من قبل المستخدم. هذا لا يمسك جميع مخليات التاريخ، ولكنه يحتفظ YYYY
جزء بين 2000
و 2029
, ، ال MM
ما بين 01
و 12
و ال DD
ما بين 01
و 31
ربما ترغب في وضع المراسي على التعبير. بمعنى آخر
^[\d]{4}-[\d]{2}-[\d]{2}$
لاحظ علامة caret والدولار.
[\d]{4}-[\d]{2}-[\d]{2}?
حيث يعني علامة الاستفهام "غير الجشع"
ربما تريد البحث عن التأكيدات إلى الأمام (على افتراض أن محركك يدعمها، PHP / PREG / PCRE يفعل)
نتطلع إلى الأمام للتأكيدات (أو التأكيدات الإيجابية) تتيح لك أن تقول "وينبغي أن تتبعها X، ولكن X لا ينبغي أن يكون جزءا من المباراة). جرب بناء الجملة التالي
\d{4}-\d{2}-\d{2}(?=[^0-9])
التأكيد هو هذا الجزء
(?=[^0-9])
يقول "بعد Regex الخاص بي، لا يمكن أن يكون الحرف التالي عددا"
إذا لم يحصل ذلك على ما تريد / تحتاجه، فانشر مثالا على المدخلات الخاصة بك ورمز PHP الخاص بك لا يعمل. يمكن لهؤلاء العناصرين أنه مفيد بشكل كبير في تصحيح هذه الأنواع من المشاكل.
يمكنك محاولة وضع رمز "^ ^" و "$" في بداية ونهاية تعبيرك:
/^[\d]{4}-[\d]{2}-[\d]{2}$/
التي تتطابق مع البداية ونهاية السلسلة على التوالي.