آموزش

چرا اعتبارسنجی ایمیل با Regex هیچ‌وقت کامل نیست

هر regexـی که برای ایمیل بنویسید، یا کاربرهای واقعی را رد می‌کند یا ورودی خراب را قبول — نمی‌شود هر دو را داشت.

تحریریه‌ی دینا کد
نویسنده
۳ دقیقه مطالعه۰ بازدید
اشتراک گذاری۰

جواب کوتاه: با regex فقط فرمت ایمیل را چک کنید — نه اینکه واقعاً وجود دارد یا نه — و آن regex را عمداً شل بگیرید. سخت‌گیری بیشتر، معمولاً یعنی رد کردن کاربرهای واقعی، نه گرفتن ورودی خراب بیشتر.

regexـی که کلاس‌ها یاد می‌دهند، کاربر واقعی را رد می‌کند

jsconst naive = /^[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z]+$/;

naive.test('[email protected]');     // false — نقطه در قسمت قبل از @ مجاز نیست
naive.test('[email protected]'); // false — + هم همین‌طور
naive.test('[email protected]');        // false — دو نقطه در دامنه رد می‌شود

سه تا از رایج‌ترین شکل‌های آدرس ایمیل واقعی — با نقطه در قسمت اول، با + برای فیلتر کردن (خیلی‌ها همین را برای ایمیل‌های موقت استفاده می‌کنند)، با ساب‌دامین — همه رد می‌شوند. کاربری که این خطا را ببیند، فکر می‌کند فرم خراب است، نه که خودش اشتباه کرده.

یک regex شل‌تر، اکثر موارد واقعی را می‌گیرد

jsconst better = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;

better.test('[email protected]');     // true
better.test('[email protected]'); // true
better.test('[email protected]');        // true

قانونش ساده است: هر چیزی که فاصله و @ نداشته باشد، بعد یک @، بعد هر چیزی که فاصله و @ نداشته باشد و حداقل یک نقطه در آن باشد.

ولی این هم رد نمی‌کند چیزهایی را که باید

jsbetter.test('[email protected].'); // true — درحالی‌که یک نقطه‌ی اضافه در آخر دامنه دارد

هیچ regex عملی‌ای نیست که همه‌ی موارد نامعتبر واقعی را بگیرد و هیچ کاربر واقعی را رد نکند. استاندارد RFC 5322 که «ایمیل معتبر» را تعریف می‌کند، خودش یک regex چند صد کاراکتری است که حتی نویسنده‌اش هم پیشنهاد نمی‌کند در پروداکشن استفاده شود.

راهی که واقعاً جواب می‌دهد

فرمت را با یک regex شل چک کنید — فقط برای گرفتن غلط‌های تایپی آشکار مثل ایمیل بدون @. بعد واقعاً بفرستید: یک لینک تأیید به همان آدرس. این تنها راهی است که ثابت می‌کند آدرس هم درست است و هم متعلق به همان کاربر — چیزی که هیچ regexـی، هرقدر هم پیچیده، نمی‌تواند تضمین کند.

اگر فرم HTML دارید، یک لایه‌ی رایگان از قبل هست

html<input type="email" required>

مرورگرها برای type="email" یک بررسی فرمت داخلی دارند و قبل از submit شدن فرم، خودشان جلوی خیلی از ورودی‌های آشکارا خراب را می‌گیرند — بدون این‌که شما هیچ regexـی بنویسید. این جای‌گزین چک سمت سرور نیست (کاربر می‌تواند جاوااسکریپت را دور بزند)، ولی برای تجربه‌ی کاربر یک قدم رایگان است که خیلی از پروژه‌ها فراموشش می‌کنند.

اگر می‌خواهید خودِ regex — گروه‌ها، quantifierها، lookahead — را عمیق‌تر یاد بگیرید، دوره‌ی Regex با تمرین‌های واقعی همین الگوها را جا می‌اندازد.

تحریریه‌ی دینا کد
نویسنده

نظرها

اولین نفری باشید که نظر می‌دهد
برای ثبت نظر وارد شوید

سؤالتان را بپرسید یا تجربه‌تان را بنویسید — نویسنده‌ی مطلب پاسخ می‌دهد.

مطالب مرتبط

از همین دسته
آموزش

چرا Rust به‌جای segfault، خطای کامپایل می‌دهد

در C یا ++C یک اشاره‌گر نامعتبر معمولاً ماه‌ها بعد، در پروداکشن، خودش را نشان می‌دهد. در Rust همان اشتباه، همان لحظه‌ی کامپایل متوقفت می‌کند.

تحریریه‌ی دینا کد۵ دقیقه
اعتبارسنجی ایمیل با regex — چرا کامل نمی‌شود — دینا کد