البرمجة

كيفية كتابة نمط Regex لتحقق من تاريخ ووقت معين في PHP

النمط الذي قمت بتحديده في التعبير العادي للتعبيرات العادية (Regex) يهدف إلى التحقق من صحة التاريخ والوقت بتنسيق معين. لكن هناك بعض الأخطاء التي يمكن أن تؤثر على أدائه. لنفحص النمط ونحدد المشكلة:

النمط الذي قمت بكتابته هو:

regex
/^([0][1-9]|[12][0-9]|3[0-1])\/([0][1-9]|1[0-2])\/(\d{4}) ([0-9]|1[0-2])\:([0-5][0-9]) (am|pm)$/

هذا النمط يبدو أنه يتحقق من التنسيق التالي: “يوم/شهر/سنة ساعة:دقيقة am/pm”.

لكن هناك بعض الأخطاء التي يمكن أن تحدث:

  1. في هذا النمط، يفترض أن اليوم يجب أن يكون بين 01 و 31، والشهر يجب أن يكون بين 01 و 12. ومع ذلك، يمكن أن يسمح النمط بالتواريخ غير الصحيحة مثل “31/02/2024”.
  2. يمكن أن يحدث خطأ إذا كان الوقت بتنسيق “ساعة:دقيقة” لا يتبع التنسيق القياسي. على سبيل المثال، إذا كانت الساعة أو الدقيقة تبدأ بصفر، فسيتم رفضها من قبل هذا النمط.
  3. النمط لا يأخذ بعين الاعتبار التواريخ بتنسيق 24 ساعة، حيث يمكن أن يكون الوقت الساعة 13 مثلاً.

لتصحيح هذه المشكلات وتحسين الأداء، يمكنك استخدام النمط التالي:

regex
/^(0[1-9]|[12][0-9]|3[01])\/(0[1-9]|1[0-2])\/\d{4} (0[0-9]|1[0-2]|2[0-3]):([0-5][0-9]) (am|pm)$/

هذا النمط يأخذ بعين الاعتبار النقاط التي ذكرناها أعلاه، ويضمن أن التواريخ والأوقات تكون صحيحة وفقاً للتنسيق المحدد.

المزيد من المعلومات

بالطبع! هذا النمط يحتوي على عدة أجزاء:

  1. ^ و $ في بداية ونهاية النمط على التوالي، وهما يستخدمان للتأكد من أن النمط يطابق السلسلة بالكامل.
  2. ([0][1-9]|[12][0-9]|3[0-1]) يتحقق من التاريخ (اليوم)، حيث تكون القيمة بين 01 و 31.
  3. \/ تستخدم للفصل بين أجزاء التاريخ.
  4. ([0][1-9]|1[0-2]) يتحقق من الشهر، حيث تكون القيمة بين 01 و 12.
  5. (\d{4}) يتحقق من السنة، حيث تكون القيمة تتألف من 4 أرقام.
  6. ([0-9]|1[0-2]) يتحقق من الساعة، حيث تكون القيمة بين 0 و 12.
  7. \:
  8. ([0-5][0-9]) يتحقق من الدقائق، حيث تكون القيمة بين 00 و 59.
  9. (am|pm) يتحقق من فترة النهار (صباحًا أو مساءًا).

لكن هناك مشكلة واحدة رئيسية في النمط، وهي أنه لا يحتوي على فراغ بين جزء التاريخ وجزء الوقت، لذلك إذا كان لديك سلسلة مع فراغ بين التاريخ والوقت، فلن يتطابق النمط. لذا، يجب إضافة فراغ بين الجزءين، مثل هذا:

regex
/^([0][1-9]|[12][0-9]|3[0-1])\/([0][1-9]|1[0-2])\/(\d{4}) ([0-9]|1[0-2])\:([0-5][0-9]) (am|pm)$/

هذا النمط الآن يحتوي على فراغ بين التاريخ والوقت، ويجب أن يعمل بشكل صحيح مع التنسيق “يوم/شهر/سنة ساعة:دقيقة am/pm”.

مقالات ذات صلة

زر الذهاب إلى الأعلى

المحتوى محمي من النسخ !!