كسي از دوستان يك Regular Expression براي تاريخ شمسي به فرمت زير مي تونه بنويسه من چند مورد نوشتم ولي باز هم خطا داره
"1385/05/08"
لطفا كمك كنيد
كسي از دوستان يك Regular Expression براي تاريخ شمسي به فرمت زير مي تونه بنويسه من چند مورد نوشتم ولي باز هم خطا داره
"1385/05/08"
لطفا كمك كنيد
یک نوع از 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
اگر نیاز داشتی که بالعکس تاریخ رو بررسی کنی، جای عبارات درون پرانتزهای دوم و چهارم رو عوض کن.
پرانتز دوم برای صحت روز، پرانتز سوم برای صحت ماه و پرانتز چهارم برای صحت سال هست.
موفق باشید.
آقا بهروز ممنون از لطفتون
اما من همين عبارت شما رو عينا بدون تغيير كپي مي كنم و در Validator قرار مي دهم اما خطاي زمان اجرا ميگيره ميگه عبارت منظم وارد شده صحيح نيست
من خودم اين عبارت رو نوشتم ولي براي تاريخ هاي مثل 1386/09/31 خطا نمي گيره ولي تو بقيه حالات درسته
^^(1[34]\d\d)\/(1[012]|0[1-9])\/(0[1-9]$|[12]\d$|3[01]$)
اين جور كه مال شما روهم ميبينم به نظر همين مشكل رو داره
من در اون عبارت با قاعده از Negative lookbehind و Negative lookahead استفاده کردم.
بدین دلیل در Validator جواب نمیده که Validator ها JavaScript-based هستند و جاوا اسکریپت از Negative lookbehind و Negative lookahead پشتیبانی نمی کنه.
موفق باشید.
ضمن اینکه نگفته بودی که RegEx رو برای Validate می خوای! اون عبارت با قاعده ای که دادم "تمامی" تاریخ های شمسی رو متن در سمت سرور پیدا می کنه.
وقتی در ابتدای عبارت با قاعده، ^ و در انتهای اون $ میگذاری، یعنی قصد Validate کردن فقط یک عبارت مشخص رو داری.
بررسی این موضوع که آیا در 6 ماه اول هستیم و ماه 31 روز هست یا در 6 ماه دوم هستیم و ماه 30 روز هست یا سال کبیسه است و اسفند 30 روز است با Embedding Conditions در RegEx مسیر هست اما مشکل اینجاست که Embedding Conditions هم در جاوا اسکریپت پشتیبانی نمیشن!نوشته شده توسط amirniknam
البته میشه بدون Embedding Conditions هم نوشت اما عبارت با قاعده ی تولیدی خیلی طولانی میشه و پردازش اون سنگین!
مثل اینکه بگی اگر کاربر ماه رو 01 یا 02 یا ... وارد کرد، قسمت روز باید تا 31 باشه و ...
موفق باشید.
علت اينكه ميخوام سمت كلاينت Validate بشه اينكه كاربر بايد يك فرم نسبتا مفصل رو پر كنه كه اطلاعات امنيتي مهمي داخل اون هست من نمي خوام بعد از رفرش شدن صفحه دوباره اون اطلاعات نمايش داده بشه براي همين وقتي صفحه رفرش ميشه كلي از فيلد هايي رو كه كاربر وارد كرده خالي ميكنه براي همين سعي كردم تمام قسمت ها رو به صورت Ajax پياده كنم تنها مورد همين تاريخ شمسي هست (البته با خوم گفتم اگه نشه مجبورم اطلاعات رو داخل Session ذخيره كنم بعد صفحه رو لود كنم)
بهروز جان،
این یعنی چی؟(?!\d+)
اون عبارت، با عنوان Negative lookahead شناخته میشه. Negative lookahead ها برای شناسایی عباراتی استفاده میشن که در انتهای اونها، کاراکتر یا عبارت مشخصی وجود "نداره". ضمن اینکه اون عبارت رو هم در نتیجه ی برگشتی قرار نمیدن.
d\ یعنی اعداد 0 تا 9 و + یعنی تکرار یک یا بیشتر.
معنای اون عبارت میشه: "بعد از سال نباید یک یا تعداد بیشتری عدد وجود داشته باشه".
به عنوان مثال، 1/1/1387 صحیح هست اما 1/1/13872 صحیح نیست.
موفق باشید.