Preg مطابقة منعطف ^ في php
-
21-08-2019 - |
سؤال
لا أستطيع استيعاب ما يفعله ^ في مباراة 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.