PDA

View Full Version : عبارت منظم براي تاريخ شمسي



amirniknam
یک شنبه 10 شهریور 1387, 19:26 عصر
كسي از دوستان يك Regular Expression براي تاريخ شمسي به فرمت زير مي تونه بنويسه من چند مورد نوشتم ولي باز هم خطا داره
"1385/05/08"


لطفا كمك كنيد

Behrouz_Rad
یک شنبه 10 شهریور 1387, 22:55 عصر
یک نوع از RegEx که بنده برای بررسی صحت تاریخ شمسی نوشتم به شکل ذیل هست:


((?<!\d+)([1-9]|[1-2][0-9]|[0][1-9]|[3][0-1]))/([1-9]|[0][1-9]|[1][0-2])/([1-9][0-9][0-9][0-9](?!\d+))

با چند تاریخ مختلف هم تستش کردم. به خوبی جواب میده.
البته این عبارت باقاعده تاریخ رو با این فرمت بررسی می کنه >>> DD/MM/YYYY
اگر نیاز داشتی که بالعکس تاریخ رو بررسی کنی، جای عبارات درون پرانتزهای دوم و چهارم رو عوض کن.
پرانتز دوم برای صحت روز، پرانتز سوم برای صحت ماه و پرانتز چهارم برای صحت سال هست.

موفق باشید.

amirniknam
دوشنبه 11 شهریور 1387, 15:06 عصر
آقا بهروز ممنون از لطفتون
اما من همين عبارت شما رو عينا بدون تغيير كپي مي كنم و در Validator قرار مي دهم اما خطاي زمان اجرا ميگيره ميگه عبارت منظم وارد شده صحيح نيست
من خودم اين عبارت رو نوشتم ولي براي تاريخ هاي مثل 1386/09/31 خطا نمي گيره ولي تو بقيه حالات درسته

^^(1[34]\d\d)\/(1[012]|0[1-9])\/(0[1-9]$|[12]\d$|3[01]$)
اين جور كه مال شما روهم ميبينم به نظر همين مشكل رو داره

Behrouz_Rad
دوشنبه 11 شهریور 1387, 15:52 عصر
من در اون عبارت با قاعده از Negative lookbehind و Negative lookahead استفاده کردم.
بدین دلیل در Validator جواب نمیده که Validator ها JavaScript-based هستند و جاوا اسکریپت از Negative lookbehind و Negative lookahead پشتیبانی نمی کنه.

موفق باشید.

Behrouz_Rad
دوشنبه 11 شهریور 1387, 16:25 عصر
ضمن اینکه نگفته بودی که RegEx رو برای Validate می خوای! اون عبارت با قاعده ای که دادم "تمامی" تاریخ های شمسی رو متن در سمت سرور پیدا می کنه.
وقتی در ابتدای عبارت با قاعده، ^ و در انتهای اون $ میگذاری، یعنی قصد Validate کردن فقط یک عبارت مشخص رو داری.


من خودم اين عبارت رو نوشتم ولي براي تاريخ هاي مثل 1386/09/31 خطا نمي گيره ولي تو بقيه حالات درست

بررسی این موضوع که آیا در 6 ماه اول هستیم و ماه 31 روز هست یا در 6 ماه دوم هستیم و ماه 30 روز هست یا سال کبیسه است و اسفند 30 روز است با Embedding Conditions در RegEx مسیر هست اما مشکل اینجاست که Embedding Conditions هم در جاوا اسکریپت پشتیبانی نمیشن!
البته میشه بدون Embedding Conditions هم نوشت اما عبارت با قاعده ی تولیدی خیلی طولانی میشه و پردازش اون سنگین!
مثل اینکه بگی اگر کاربر ماه رو 01 یا 02 یا ... وارد کرد، قسمت روز باید تا 31 باشه و ...

موفق باشید.

amirniknam
چهارشنبه 13 شهریور 1387, 08:14 صبح
علت اينكه ميخوام سمت كلاينت Validate بشه اينكه كاربر بايد يك فرم نسبتا مفصل رو پر كنه كه اطلاعات امنيتي مهمي داخل اون هست من نمي خوام بعد از رفرش شدن صفحه دوباره اون اطلاعات نمايش داده بشه براي همين وقتي صفحه رفرش ميشه كلي از فيلد هايي رو كه كاربر وارد كرده خالي ميكنه براي همين سعي كردم تمام قسمت ها رو به صورت Ajax‌ پياده كنم تنها مورد همين تاريخ شمسي هست (البته با خوم گفتم اگه نشه مجبورم اطلاعات رو داخل Session ذخيره كنم بعد صفحه رو لود كنم)

Developer Programmer
جمعه 15 آذر 1387, 18:58 عصر
بهروز جان،

(?!\d+)
این یعنی چی؟

Behrouz_Rad
جمعه 15 آذر 1387, 22:20 عصر
اون عبارت، با عنوان Negative lookahead شناخته میشه. Negative lookahead ها برای شناسایی عباراتی استفاده میشن که در انتهای اونها، کاراکتر یا عبارت مشخصی وجود "نداره". ضمن اینکه اون عبارت رو هم در نتیجه ی برگشتی قرار نمیدن.
d\ یعنی اعداد 0 تا 9 و + یعنی تکرار یک یا بیشتر.
معنای اون عبارت میشه: "بعد از سال نباید یک یا تعداد بیشتری عدد وجود داشته باشه".
به عنوان مثال، 1/1/1387 صحیح هست اما 1/1/13872 صحیح نیست.

موفق باشید.