ما هو نمط التعبير العادي لوقت التاريخ (2008-09-01 12:35:45)؟

StackOverflow https://stackoverflow.com/questions/37732

  •  09-06-2019
  •  | 
  •  

سؤال

ما هو نمط RegEx لـ DateTime (2008-09-01 12:35:45)؟

أحصل على هذا الخطأ:

لم يتم العثور على محدد النهاية '^'

استخدام:

preg_match('(?n:^(?=\d)((?<day>31(?!(.0?[2469]|11))|30(?!.0?2)|29(?(.0?2)(?=.{3,4}(1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|(16|[2468][048]|[3579][26])00))|0?[1-9]|1\d|2[0-8])(?<sep>[/.-])(?<month>0?[1-9]|1[012])\2(?<year>(1[6-9]|[2-9]\d)\d{2})(?:(?=\x20\d)\x20|$))?(?<time>((0?[1-9]|1[012])(:[0-5]\d){0,2}(?i:\ [AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$)', '2008-09-01 12:35:45');

يعطي هذا الخطأ:

تحذير:preg_match() [function.preg-match]:فشل التجميع:لا يوجد شيء يمكن تكراره عند الإزاحة 0 في E:\www\index.php في السطر 19

هل كانت مفيدة؟

المحلول

@إسبو:أود فقط أن أقول أن regex أمر لا يصدق.لا أكره أن أضطر إلى كتابة التعليمات البرمجية التي قدمت شيئًا مفيدًا للمطابقات، مثل إذا كنت تريد معرفة التاريخ والوقت الذي كتبه المستخدم بالفعل.

يبدو أن حل توم سيكون أكثر قابلية للاستمرار، لأنه أبسط بنحو زليون مرة ومع إضافة بعض الأقواس يمكنك بسهولة الحصول على القيم التي كتبها المستخدم:

(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})

إذا كنت تستخدم لغة Perl، فيمكنك الحصول على القيم بشيء مثل هذا:

$year = $1;
$month = $2;
$day = $3;
$hour = $4;
$minute = $5;
$second = $6;

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

نصائح أخرى

نسخة بسيطة تعمل مع التنسيق المذكور، ولكن ليس جميع التنسيقات الأخرى وفقًا لـEspos:

(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) 

http://regexlib.com/REDetails.aspx?regexp_id=610

^(?=\d)(?:(?:31(؟!.(?:0?[2469]|11))|(?:30|29)(؟!.0?2)|29(? =.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][ 26])|(?:(?:16|[2468][048]|[3579][26])00))))(?:\x20|$))|(?:2[0-8]| 1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2 -9]\d)?\d\d(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0- 5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2}) ?$


هذا إعادة التحقق من صحة كل من التواريخ و/أو أنماط الأوقات.أيام شهر فبرايركما تم التحقق من صحتها لسنوات القفز.بلح:بتنسيق DD/MM/YYYY أو D/M/YY بين 1/1/1600 - 31/12/9999.الأصفار الرائدة اختيارية.يمكن أن تكون فواصل التاريخ إما شرطات مطابقة (-) أو مائلة (/) أو فترات (.) مرات:في HH: MM: SS AM/PM تنسيق 12 ساعة (12:00 صباحًا - 11:59:59 مساءً) أو HH: MM: تنسيق الوقت العسكري (00:00:00 - 23:59:59).تنسيق الوقت لمدة 12 ساعة:1) قد يكون لها الصفر الرائد للساعة.2) الدقائق والثواني اختيارية لتنسيق 12 ساعة 3) AM أو PM مطلوب وحساسية حساسة.الوقت العسكري 1) يجب أن يكون له صفر رائد لجميع ساعات أقل من 10.2) الدقائق هي معرض.3) ثواني اختيارية.أوقات التاريخ:مزيج من التنسيقات أعلاه.تاريخ أولا ثم وقت مفصل بمساحة.EX) DD/MM/YYYY HH: MM: SS


يحرر:تأكد من نسخ RegEx من موقع regexlib.com حيث يقوم StackOverflow أحيانًا بإزالة/تدمير الأحرف الخاصة.

^([2][0]\d{2}\/([0]\d|[1][0-2])\/([0-2]\d|[3][0-1]))$|^([2][0]\d{2}\/([0]\d|[1][0-2])\/([0-2]\d|[3][0-1])\s([0-1]\d|[2][0-3])\:[0-5]\d\:[0-5]\d)$
$date = "2014-04-01 12:00:00";

preg_match('/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/',$date, $matches);

print_r($matches);

ستكون المطابقات $:

Array ( 
   [0] => 2014-04-01 12:00:00 
   [1] => 2014 
   [2] => 04 
   [3] => 01 
   [4] => 12 
   [5] => 00 
   [6] => 00
)

طريقة سهلة لتفكيك سلسلة منسقة بالتاريخ والوقت.

فيما يتعلق بإجابة عمران من 1 سبتمبر 2008 الساعة 12:33 ، هناك مفقود:في النمط الأنماط الصحيحة

preg_match('/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/', '2008-09-01 12:35:45', $m1);
print_r( $m1 );
preg_match('/\d{4}-\d{2}-\d{2} \d{1,2}:\d{2}:\d{2}/', '2008-09-01 12:35:45', $m2);
print_r( $m2 );
preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/', '2008-09-01 12:35:45', $m3);
print_r( $m3 );

هذا يعود

Array ( [0] => 2008-09-01 12:35:45 )
Array ( [0] => 2008-09-01 12:35:45 )
Array ( [0] => 2008-09-01 12:35:45 ) 

هنا هو الحل الخاص بي:

/^(2[0-9]{3})-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01]) (0[0-9]|1[0-9]|2[0123])\:([012345][0-9])\:([012345][0-9])$/u

لقد قمت بتعديل نمط regex من http://regexlib.com/REDetails.aspx?regexp_id=610.يجب أن يتطابق النمط التالي مع حالتك.

^(?=\d)(?:(?:1[6-9]|[2-9]\d)?\d\d([-.\/])(?:1[012]|0?[1-9])\1(?:31(?<!.(?:0[2469]|11))|(?:30|29)(?<!.02)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$

YYYY-MM-DD سمو:MM:SS

تحتاج وظائف PHP preg إلى تغليف التعبير العادي الخاص بك بحرف محدد، والذي يمكن أن يكون أي حرف.لا يمكنك استخدام هذا الحرف المحدد دون الهروب داخل التعبير العادي.يجب أن يعمل هذا (هنا الحرف المحدد هو /):

preg_match('/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/', '2008-09-01 12:35:45');

// or this, to allow matching 0:00:00 time too.
preg_match('/\d{4}-\d{2}-\d{2} \d{1,2}:\d{2}:\d{2}/', '2008-09-01 12:35:45');

إذا كنت بحاجة إلى مطابقة الأسطر التي تحتوي على وقت وتاريخ فقط، أضف ^ و$ في بداية ونهاية التعبير العادي.

preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/', '2008-09-01 12:35:45');

رابط إلى دليل PHP preg_match()

إليك نسخة مبسطة (نشأت من إجابة إسبو).فهو يتحقق من صحة التاريخ (حتى السنة الكبيسة)، كما أن hh:mm:ss اختيارية
الأمثلة التي تعمل:
- 31/12/2003 11:59:59
- 29-2-2004

^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2-9]\d)?\d\d(?:(?=\x20\d)\x20|$))(|([01]\d|2[0-3])(:[0-5]\d){1,2})?$

هنا هو الحل الخاص بي:

[12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]) ([01][0-9]|2[0-3]):[0-5]\d

Regular expression visualization

ديبوغيكس التجريبي

https://regex101.com/r/lbthaT/4

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top