سؤال

لا أستطيع استيعاب ما يفعله ^ في مباراة preg_match الخاصة بي.

 if (preg_match('~^(\d\d\d\d)(-(\d{1,2})(-(\d{1,2}))?)?$~', trim($date), $dateParts)) {
   echo the $dateparts and do some magic with them
 } else {
   tell me the date is formatted wrong
 }

كما أراها ، هذا يتطلع لمعرفة ما إذا كان تاريخ $ يتطابق مع التنسيق الذي قرأته على أنه 4 عشرية - 1 أو 2 من العشرية - 1 أو 2 عشرية

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

ومع ذلك ، فإن مجرد تمريره في تاريخ $ = '1977 "دون أي شيء آخر (لا يوم أو شهر) ، لا يزال يمر صحيحًا ويعرض مكونات DateParts ، وأعتقد أنه سيرمي خطأ؟

هل يمكن لأي شخص أن يشير إلى ما أفتقده في التعبير العادي؟أعتقد أن ^ أو ربما ?$ في النهاية قد يعني فقط مطابقة جزء منه؟

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

المحلول

وليس هناك حاجة لمجموعة <م> كل شيء . هذا يبدو أجمل، وسوف تفعل الشيء نفسه:

preg_match('~^\d{4}(-\d{1,2}(-\d{1,2})?)?$~', trim($date), $dateParts)

وهذا ما يفسر أيضا لماذا قبلت "1977" - الأجزاء الشهر واليوم هي <م> على حد سواء اختياري (علامة الاستفهام يجعل شيء اختياري)

.

لتفعل ما تقوله ( "4 عشرى - 1 أو 2 عشرى - 1 أو 2 عشرية")، تحتاج إلى إزالة كل المجموعات اختياري:

preg_match('~^\d{4}-\d{1,2}-\d{1,2}$~', trim($date), $dateParts)

وو"^" و "$" لها علاقة مع المشكلة التي نشهد شيئا. هم مجرد بداية لسلسلة والمراسي نهاية سلسلة، والتأكد من أن <م> أي شيء آخر مما يصف النمط في سلسلة التحقق. ترك أجبرتها على الفرار، وسوف "blah 1977-01-01 blah" تبدأ المباراة.

نصائح أخرى

وجرب هذا:

'~^(\d\d\d\d)-(\d{1,2})-(\d{1,2})$~'

ومشكله والتعبير المعتاد تم السماح الشهر واليوم واختياري من قبل '؟ شخصية.

و^ و$ ترسيخ نمط لبداية ونهاية على التوالي من السلسلة التي تم تمريرها في. ? هو مضاعف، مطابقة 0 أو 1 من النمط السابق (في هذه الحالة، بت parenthesised).

ونمط مباريات في السنة، أو سنة وشهر واحد، أو سنة وشهر والتاريخ؛ إذا كنت تتبع الأقواس، سترى ? نهائي تعمل على أقواس المحيطة وكلها من نمط بعد عام.

^    # beginning of string
    (\d\d\d\d)   #year
    (
        -(\d{1,2})   #month after a dash
        (
            -(\d{1,2}) #date after a dash
        )? #date optional
    )?   # month and date optional
$   # end of string

حسنًا، دعنا نقسم هذا لك:

  • '~^(\d\d\d\d)(-(\d{1,2})(-(\d{1,2}))?)?$~'
  • ~ - في البداية والنهاية توجد محددات RegExp، لذا فهي ليست جزءًا من التعبير العادي.
  • ^ - وسائل "هذه بداية السطر"
    • يتجنب التطابقات في منتصف السلسلة، ويثبتها بحيث يجب أن تتطابق بداية السلسلة
  • (\د\د\د\د) - يطابق (ويلتقط) أربعة أرقام، وهو ليس اختياريًا
    • ويمكن أيضًا كتابة هذا كـ \د{4}
  • (-(\د{1,2})(-(\د{1,2}))?)؟ - يطابق (ويلتقط) مجموعة اختيارية.
    • تقول أنه في حالة وجود هذه المجموعة، يجب أن تكون شرطة، تليها رقم أو رقمين (يوم أو شهر)، تليها شرطة، تليها رقم أو رقمين (يوم أو شهر)
  • $ - تعني نهاية السلسلة، لذا فإن هذا بالإضافة إلى ^ في بداية السلسلة يعني أن السلسلة بأكملها يجب أن تتطابق مع التعبير العادي.

بعض الأمثلة على ما سيطابقه هذا Regex:

  • 1982-08-11
  • 1982-30-01
  • 8127-99-52

بعض الأمثلة التي لن تتطابق:

  • 82-08-11
  • 2009-10

كما ترون، سيقبل هذا التعبير العادي بعض "التواريخ" التي ليست تواريخ صالحة حقًا، لذلك من المحتمل أن أقوم بتشغيلها من خلال نوع ما من وظائف معالجة التاريخ أيضًا، مثل com.strtotime.

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