فهرست مطالب
با regex فقط فرمت ایمیل را چک کنید؛ اینکه واقعاً وجود دارد یا نه را نمیشود فهمید. آن regex را هم عمداً شل بگیرید؛ سختگیری بیشتر معمولاً یعنی رد کردن کاربرهای واقعی، نه گرفتن ورودی خراب بیشتر.
regexی که کلاسها یاد میدهد، کاربر واقعی را رد میکند
jsconst naive = /^[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z]+$/;
naive.test('sara.ahmadi@example.com'); // false، نقطه در قسمت قبل از @ مجاز نیست
naive.test('reza+newsletter@example.com'); // false، + هم همینطور
naive.test('user@mail.example.co'); // false، دو نقطه در دامنه رد میشود
هر سه شکل رایجِ آدرس ایمیل واقعی رد میشوند: آدرس با نقطه در قسمت اول، آدرس با + برای فیلتر کردن (خیلیها همین را برای ایمیلهای موقت استفاده میکنند) و آدرس با سابدامین. کاربری که این خطا را میبیند فکر میکند فرم خراب است، نه اینکه خودش اشتباه کرده.
یک regex شلتر، اکثر موارد واقعی را میگیرد
jsconst better = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
better.test('sara.ahmadi@example.com'); // true
better.test('reza+newsletter@example.com'); // true
better.test('user@mail.example.co'); // true
قانونش ساده است: هر چیزی که فاصله و @ نداشته باشد، بعد یک @، بعد هر چیزی که فاصله و @ نداشته باشد و حداقل یک نقطه در آن باشد.
ولی این هم چیزهایی را که باید رد نمیکند
jsbetter.test('trailing-dot@example.com.'); // true، درحالیکه نقطهی اضافه در آخر دامنه دارد
هیچ regex عملیای نیست که همهی موارد نامعتبر واقعی را بگیرد و هیچ کاربر واقعی را رد نکند. استانداردی که «ایمیل معتبر» را تعریف میکند (RFC 5322 و پیشینهاش RFC 822) چنان پیچیده است که regexی کاملاً منطبق بر آن چند هزار کاراکتر طول میکشد؛ نویسندهی مشهورترین پیادهسازی هم صریح نوشته بود که اعتبارسنجی ایمیل با regex از مرزِ عقلانیبودنِ کار با این ابزار عبور میکند.
راهی که واقعاً جواب میدهد
فرمت را با یک regex شل چک کنید و هدفش فقط گرفتن غلطهای تایپی آشکار باشد، مثل ایمیل بدون @. بعد واقعاً بفرستید؛ یک لینک تأیید به همان آدرس. این تنها راهی است که ثابت میکند آدرس هم درست است و هم متعلق به همان کاربر؛ چیزی که هیچ regexی، هرقدر هم پیچیده، نمیتواند تضمین کند.
اگر فرم HTML دارید، یک لایهی رایگان از قبل هست
html<input type="email" required>
مرورگرها برای type="email" یک بررسی فرمت داخلی دارند و قبل از submit شدن فرم جلوی خیلی از ورودیهای آشکارا خراب را بدون هیچ regexی میگیرند. این جایگزین چک سمت سرور نیست (کاربر میتواند جاوااسکریپت را دور بزند)، ولی برای تجربهی کاربر یک قدم رایگان است که خیلی از پروژهها فراموشش میکنند.
اگر میخواهید خودِ regex را عمیقتر یاد بگیرید (گروهها، quantifierها، lookahead)، دورهی Regex با تمرینهای واقعی همین الگوها را جا میاندازد.




نظرها
اولین نفری باشید که نظر میدهدسؤالتان را بپرسید یا تجربهتان را بنویسید تا نویسندهی مطلب پاسخ بدهد.