FA-TOOLS — Header Component
آموزش اعتبار‌سنجی (Validation) شماره موبایل و کد ملی با Regex

آموزش اعتبار‌سنجی (Validation) شماره موبایل و کد ملی با Regex

🚀 نقشه راه اعتبار‌سنجی موبایل و کد ملی با رگولار اکسپرشن (Regex)

✅ اعتبار‌سنجی شماره موبایل

  • ▪ ساختار: 09XX-XXX-XXXX
  • ▪ Regex پایه: `^09d{9}$`
  • ▪ Regex پیشرفته: شامل پیش‌شماره (+98) و یا بدون صفر اول
  • ▪ چالش: فرمت‌های متفاوت، خطوط ثابت

👤 اعتبار‌سنجی کد ملی

  • ▪ ساختار: 10 رقم
  • ▪ Regex پایه: `^d{10}$`
  • ▪ Regex پیشرفته: همراه با الگوریتم کنترلی
  • ▪ چالش: رقم کنترل، کد ملی‌های غیرمعتبر (مثل ۱۲۳۴۵۶۷۸۹۰)

🛠️ ابزارهای کمکی: توضیحات کامل Regex، مثال‌های عملی، عیب‌یابی سریع و راه‌حل‌های هوشمندانه برای هر برنامه‌نویس.

با ما همراه باش تا داده‌هات رو مثل یک حرفه‌ای اعتبار‌سنجی کنی!

سلام رفیق برنامه‌نویس! اگه سر و کارت با فرم‌ها و اطلاعات کاربراست، حتماً بارها با چالش اعتبار‌سنجی (Validation) روبه‌رو شدی. اینکه چطور مطمئن بشی شماره موبایلی که کاربر وارد کرده واقعیه یا کد ملیش درست و معتبره، یه دغدغه همیشگیه. فکرش رو بکن، اگه یه دیتابیس پر از اطلاعات غلط و ناقص داشته باشی، چه بلایی سر پروژه‌ت میاد؟ از خطا تو فرایند ثبت‌نام گرفته تا مشکلات امنیتی و حتی از دست دادن مشتری! دقیقاً همینجاست که رگولار اکسپرشن (Regex) مثل یک قهرمان وارد میشه و کار رو برات حسابی راحت می‌کنه. تو این مقاله قراره گام به گام بریم سراغ اعتبار‌سنجی دو تا از مهم‌ترین فیلدهای اطلاعاتی تو ایران: شماره موبایل و کد ملی. پس اگه دنبال یه راه حل قوی و مطمئنی تا اطلاعاتت رو حسابی فیلتر کنی و دیتای تمیز داشته باشی، جای درستی اومدی.
برای اینکه کارت حسابی راه بیفته و ابزارهای مورد نیازت همیشه دم دستت باشه، یه سر به فروشگاه ابزارها بزن، کلی چیزای خفن و کاربردی پیدا می‌کنی!
اگه هم سوالی داشتی یا نیاز به راهنمایی بیشتر بود، همیشه می‌تونی با این شماره تماس بگیری: 09202232789

فهرست مطالب

آموزش اعتبار‌سنجی (Validation) شماره موبایل و کد ملی با Regex — تصویر 1

چرا اعتبار‌سنجی لازمه؟

آموزش اعتبار‌سنجی (Validation) شماره موبایل و کد ملی با Regex — تصویر 2

شاید با خودت بگی، خب یه کاربر اطلاعات اشتباه وارد کنه، مگه چی میشه؟ اما حقیقت اینه که اعتبار‌سنجی داده‌ها، از پایه‌های اصلی هر سیستم نرم‌افزاری موفقه. بیا چند تا از دلایل مهمش رو با هم مرور کنیم:

  • یکپارچگی داده (Data Integrity): اگه داده‌ها معتبر نباشن، دیتابیس شما پر از آشغال میشه. شماره موبایل‌های ناقص، کد ملی‌های الکی، ایمیل‌های ساختگی… اینا باعث میشن گزارش‌هات غلط از آب دربیاد، نتونی با کاربرا ارتباط برقرار کنی و کلاً سیستم‌ت غیرقابل اعتماد بشه.
  • تجربه کاربری بهتر (Better UX): هیچ‌کس دوست نداره فرمی رو پر کنه و بعد از سابمیت کردن، با یه عالمه خطای بی‌معنی روبه‌رو بشه. اعتبار‌سنجی بلادرنگ (real-time validation) و پیام‌های خطای واضح، به کاربر کمک می‌کنه تا همون لحظه اشتباهش رو بفهمه و تصحیحش کنه. این یعنی کاربر از سیستم شما تجربه‌ی بهتری خواهد داشت.
  • امنیت (Security): داده‌های نامعتبر می‌تونن راه رو برای حملات امنیتی مثل SQL Injection یا Cross-Site Scripting (XSS) باز کنن. اعتبار‌سنجی دقیق، به خصوص برای فیلدهایی مثل کد ملی یا شماره موبایل، یه لایه امنیتی اولیه و ضروریه.
  • فرایندهای تجاری صحیح: خیلی از فرایندهای تجاری، مثل ارسال پیامک تأیید، احراز هویت، یا حتی فاکتورینگ، به صحت اطلاعات ورودی وابسته هستن. اگه شماره موبایل یا کد ملی معتبر نباشه، کل این فرایندها مختل میشن و هزینه‌های اضافی بهت تحمیل میشه.

رگولار اکسپرشن (Regex) چیست؟

آموزش اعتبار‌سنجی (Validation) شماره موبایل و کد ملی با Regex — تصویر 3

رگولار اکسپرشن، یا همون Regex، یه توالی از کاراکترهاست که برای تعریف یک الگوی جستجو تو متن استفاده میشه. فکر کن می‌خوای تو یه سند بزرگ دنبال همه شماره تلفن‌ها یا آدرس ایمیل‌ها بگردی؛ تایپ کردن هر فرمت ممکن خیلی سخته. Regex بهت این امکان رو میده که یه الگو (Pattern) کلی تعریف کنی و به کامپیوتر بگی هر چیزی که این الگو رو داشت، پیدا کن. این الگوها شامل کاراکترهای معمولی (مثل حروف و اعداد) و فراداده‌ها (Metacharacters) هستن که معنی خاصی دارن. مثلاً `d` یعنی “هر رقمی” و `+` یعنی “یک یا بیشتر از عنصر قبلی”.

Regex یه ابزار فوق‌العاده قدرتمنده برای پیدا کردن، جایگزین کردن و اعتبار‌سنجی رشته‌ها. یادگیریش شاید اولش کمی گیج‌کننده به نظر بیاد، ولی اگه مفاهیم پایه رو درک کنی، دیگه ازش جدا نمیشی. اگه میخوای اطلاعات بیشتری در مورد Regex و کاربردهاش به دست بیاری، حتماً یه سر به صفحه اصلی fa-tools بزن. اونجا کلی منابع مفید پیدا می‌کنی که بهت کمک می‌کنه تا مهارت‌هات رو ارتقا بدی.

چند تا از فراداده‌های مهم در Regex:

  • `.` (نقطه): هر کاراکتری به جز خط جدید.
  • `d`: هر رقم (0-9). معادل `[0-9]`.
  • `w`: هر حرف، رقم یا آندرلاین. معادل `[a-zA-Z0-9_]`.
  • `s`: هر کاراکتر فاصله (مثل اسپیس، تب، خط جدید).
  • `*`: صفر یا بیشتر از عنصر قبلی.
  • `+`: یک یا بیشتر از عنصر قبلی.
  • `?`: صفر یا یک از عنصر قبلی (اختیاری).
  • `{n}`: دقیقاً `n` بار از عنصر قبلی.
  • `{n,m}`: بین `n` تا `m` بار از عنصر قبلی.
  • `^`: شروع خط/رشته.
  • `$`: پایان خط/رشته.
  • `[]`: مجموعه‌ای از کاراکترها. مثلاً `[abc]` یعنی ‘a’ یا ‘b’ یا ‘c’.
  • `()`: گروه بندی. برای اعمال کوانتفایرها یا استخراج زیررشته‌ها.
  • `|`: یا (OR). مثلاً `cat|dog` یعنی ‘cat’ یا ‘dog’.

اعتبار‌سنجی شماره موبایل ایرانی

اعتبار‌سنجی شماره موبایل تو ایران یه داستان مخصوص خودشو داره. برخلاف خیلی از کشورها که شاید فرمت‌های خیلی متنوعی نداشته باشن، تو ایران ممکنه کاربرا شماره رو با صفر اول، بدون صفر، با کد کشور (+98)، یا حتی با فاصله و خط تیره وارد کنن. ما باید بتونیم تا جای ممکن این حالت‌ها رو پوشش بدیم.

ساختار شماره موبایل در ایران

شماره موبایل‌های ایرانی معمولاً ۱۱ رقمی هستن که با `09` شروع میشن. بعد از `09`، دو رقم بعدی پیش‌شماره اپراتور رو مشخص می‌کنه (مثل 0912 برای همراه اول، 0935 برای ایرانسل و…). بعد از اون هم ۷ رقم بعدی، شماره اختصاصی مشترکه.

ساختار کلی:

  • 📱 شروع با `09` (یا `+989` یا فقط `9`)
  • ✅ مجموعاً ۱۱ رقم با احتساب صفر اول
  • ⭐ مثال: `09123456789`

الگوهای Regex برای شماره موبایل

بریم سراغ سناریوهای مختلف و Regex‌های مربوط به هر کدوم:

1. فرمت استاندارد (با صفر اول): `09xx-xxx-xxxx`

این رایج‌ترین فرمت شماره موبایله که با `09` شروع میشه و ۱۱ رقمه:

^09d{9}$

  • ^: شروع رشته.
  • 09: باید با 09 شروع بشه.
  • d{9}: ۹ رقم عددی دیگه (بعد از 09) که در مجموع ۱۱ رقم میشه.
  • $: پایان رشته.

2. فرمت با کد کشور: `+989xx-xxx-xxxx`

اگه کاربرا کد کشور رو هم وارد می‌کنن، این الگو به کارت میاد:

^(+98|0)?9d{9}$

  • (+98|0)?: یعنی رشته می‌تونه با `+98` یا `0` شروع بشه، یا اصلاً با هیچکدوم (علامت `?` باعث میشه این گروه اختیاری باشه).
  • بقیه الگو مثل قبل، `9` و ۹ رقم دیگه.

3. فرمت با فاصله یا خط تیره (انعطاف‌پذیر):

اگه می‌خوای شماره‌هایی مثل `0912 123 4567` یا `0912-123-4567` هم قبول بشن، این الگو مناسبه:

^(+98|0)?9d{2}[- ]?d{3}[- ]?d{4}$

  • [- ]?: به معنی یک خط تیره یا یک فاصله، که هر دو اختیاری هستن (صفر یا یک بار).

نکته مهم:

اعتبار‌سنجی Regex فقط ساختار رو بررسی می‌کنه، نه وجود واقعی شماره. یعنی با Regex نمی‌تونی بفهمی یه شماره موبایل واقعاً فعال هست یا نه. برای این کار نیاز به سرویس‌های احراز هویت پیامکی (OTP) داری.

جدول: مثال‌هایی از الگوهای رایج شماره موبایل
فرمت شماره موبایل نمونه‌های قابل قبول
استاندارد (09xxxxxxxx) 09123456789, 09351234567
با کد کشور (+989xxxxxxxxx) +989123456789, +989351234567
بدون صفر اول (9xxxxxxxxx) 9123456789, 9351234567
با فاصله یا خط تیره (انعطاف‌پذیر) 0912 345 6789, 0935-123-4567, +98 912 345 6789

اعتبار‌سنجی کد ملی ایرانی

اعتبار‌سنجی کد ملی، داستانش کمی پیچیده‌تر از شماره موبایله. اینجا دیگه فقط با طول و فرمت سروکار نداریم، بلکه یه الگوریتم کنترلی هم پشتش خوابیده که باید رعایت بشه. یعنی هر ۱۰ رقم عددی، کد ملی معتبری نیست.

ساختار کد ملی و الگوریتم کنترل صحت

کد ملی ایرانی یک عدد ۱۰ رقمیه که از سمت چپ، سه رقم اول کد شهرستان محل صدور رو نشون میده. ۷ رقم بعدی به صورت تصادفی اختصاص داده میشن و رقم دهم هم رقم کنترل (Check Digit) هست که با یک الگوریتم خاص محاسبه میشه. این رقم کنترل کمک می‌کنه تا از وارد کردن کد ملی‌های اشتباه یا تایپی جلوگیری بشه.

الگوریتم محاسبه رقم کنترل (روش ساده):

  1. 9 رقم اول کد ملی رو در نظر بگیر.
  2. هر رقم رو به ترتیب در اعداد 10 تا 2 ضرب کن (رقم اول در 10، رقم دوم در 9 و … رقم نهم در 2).
  3. حاصل ضرب‌ها رو با هم جمع کن.
  4. مجموع رو بر 11 تقسیم کن و باقیمانده رو به دست بیار.
  5. اگه باقیمانده کوچکتر از 2 بود، رقم کنترل باید برابر با همون باقیمانده باشه.
  6. اگه باقیمانده بزرگتر یا مساوی 2 بود، رقم کنترل باید برابر با `11 – باقیمانده` باشه.
  7. در نهایت، این رقم کنترلی که محاسبه کردی باید با رقم دهم کد ملی ورودی برابر باشه.

این الگوریتم رو نمیشه فقط با Regex پیاده‌سازی کرد و نیاز به یه کوچولو کدنویسی هم هست.

Regex اولیه برای کد ملی

اولین گام تو اعتبار‌سنجی کد ملی، اینه که مطمئن بشیم ورودی یک عدد ۱۰ رقمیه و شامل حروف یا کاراکترهای دیگه نیست. این کار رو به راحتی با Regex میشه انجام داد:

^d{10}$

این Regex فقط چک می‌کنه که رشته‌ی وارد شده دقیقاً ۱۰ رقم عددی باشه. اما همونطور که گفتم، این تازه اول کاره. کد ملی مثل `1111111111` یا `1234567890` با این Regex معتبر شناخته میشه، در حالی که در واقعیت نامعتبرن.

الگوریتم اعتبار‌سنجی پیشرفته (همراه با کدنویسی)

برای اعتبار‌سنجی کامل کد ملی، باید Regex رو با کدنویسی ترکیب کنیم. این یه مثال از چگونگی پیاده‌سازی این الگوریتم به زبان JavaScript هست. تو زبان‌های دیگه مثل PHP یا Python هم منطق کار دقیقاً همینه.

مثال JavaScript برای اعتبار‌سنجی کد ملی:


function isValidIranianNationalCode(input) {
    if (!/^d{10}$/.test(input)) return false; // Regex اولیه: 10 رقم عددی
    
    // از بین بردن صفرهای اضافی از سمت چپ (اگر وجود داشته باشد)
    const nationalCode = ("0000000000" + input).slice(-10);

    // بررسی کدهای ملی تکراری (مثلاً 1111111111)
    if (/^(d)1{9}$/.test(nationalCode)) return false;

    let sum = 0;
    for (let i = 0; i < 9; i++) {
        sum += parseInt(nationalCode[i]) * (10 - i);
    }
    const remainder = sum % 11;
    const controlDigit = parseInt(nationalCode[9]);

    if (remainder < 2) {
        return controlDigit === remainder;
    } else {
        return controlDigit === (11 - remainder);
    }
}

// مثال استفاده:
// console.log(isValidIranianNationalCode("0023963004")); // یک کد ملی معتبر - true
// console.log(isValidIranianNationalCode("1234567890")); // نامعتبر - false (رقم کنترل اشتباه)
// console.log(isValidIranianNationalCode("1111111111")); // نامعتبر - false (رقم تکراری)
// console.log(isValidIranianNationalCode("002396300X")); // نامعتبر - false (حرف)
        

تو این تابع، اول با Regex چک می‌کنیم که ورودی حتماً ۱۰ رقم باشه. بعدش، با الگوریتم کنترلی که توضیح دادیم، رقم دهم رو اعتبار‌سنجی می‌کنیم. اینجوری یه اعتبار‌سنجی دو مرحله‌ای و قدرتمند داریم.

کدهای آماده و اسنیپت‌های این شکلی رو می‌تونی تو بخش کدهای آماده و اسنیپت سایت ما پیدا کنی. با استفاده از این ابزارها می‌تونی خیلی سریع‌تر توسعه بدی و دیگه وقتت رو الکی سر چیزای تکراری از دست ندی.

جزئیات و ترفندهای Regex

Regex دنیای پر از جزئیاته. دونستن چند تا ترفند می‌تونه الگوهای شما رو قدرتمندتر و بهینه‌تر کنه.

  • Lookahead و Lookbehind: اینا ابزارهایی هستن که به Regex اجازه میدن بدون مصرف کردن کاراکترها (یعنی بدون اینکه تو رشته مطابقت یافته قرار بگیرن)، جلو یا عقب رو نگاه کنن. مثلاً `(?=pattern)` (positive lookahead) چک می‌کنه که بلافاصله بعد از موقعیت فعلی، الگو وجود داشته باشه.
  • کوانتیفایر حریص (Greedy) در برابر غیرحریص (Lazy): به طور پیش‌فرض، کوانتیفایرهایی مثل `*`, `+`, `?` و `{}` تا جای ممکن بیشترین تطابق رو پیدا می‌کنن (Greedy). با اضافه کردن `?` بعد از کوانتیفایر، می‌تونید اون رو Lazy کنید تا کمترین تطابق رو پیدا کنه. مثلاً `.*?`
  • گروه‌های Non-capturing: اگه گروهی رو فقط برای گروه بندی می‌خواین و نمی‌خواین محتوای اون گروه رو ذخیره کنید، از `(?:…)` به جای `(…)` استفاده کنید. این کار کمی عملکرد رو بهتر می‌کنه.
  • پرهیز از Backtracking زیاد: Regex‌های پیچیده با کوانتیفایرهای زیاد روی الگوهای طولانی می‌تونن باعث مشکل “Catastrophic Backtracking” بشن و برنامه رو کند کنن. سعی کنید الگوها رو تا جای ممکن مشخص و دقیق بنویسید و از تودرتویی بیش از حد بپرهیزید.

اشتباهات رایج در اعتبار‌سنجی با Regex

حتی حرفه‌ای‌ها هم گاهی تو استفاده از Regex دچار اشتباه میشن. اینجا چند تا از رایج‌ترین اشتباهات رو می‌گم تا تو به دامشون نیفتی:

  • اعتبار‌سنجی بیش از حد (Over-validation): گاهی اوقات توسعه‌دهنده‌ها Regex رو خیلی سخت‌گیرانه می‌نویسن. مثلاً شماره موبایلی که با فاصله وارد شده رو رد می‌کنن. این کار تجربه کاربری رو بد می‌کنه و ممکنه کاربرا از ثبت‌نام منصرف بشن. همیشه سعی کن تا جای ممکن انعطاف‌پذیر باشی ولی از چهارچوب استاندارد خارج نشی.
  • اعتبار‌سنجی ناکافی (Under-validation): از اون طرف، اگه Regex خیلی ساده باشه (مثلاً فقط چک کنه ۱۰ رقم عددی باشه برای کد ملی)، اطلاعات غلط رو از فیلتر رد می‌کنه. باید یه تعادل بین سخت‌گیری و انعطاف‌پذیری ایجاد کنی.
  • فراموش کردن Anchor‌ها (`^` و `$`): اگه `^` و `$` رو اول و آخر Regex نذاری، Regex فقط چک می‌کنه که الگو *در جایی از رشته* وجود داشته باشه، نه اینکه *کل رشته* دقیقاً همون الگو باشه. این می‌تونه نتایج اشتباهی بده.
  • عدم در نظر گرفتن موارد خاص: مثلاً برای شماره موبایل، باید حالت‌های شروع با ۰۹، +۹۸۹ و حتی ۹ رو پوشش بدی. اگه فقط روی یه حالت تمرکز کنی، ممکنه کلی کاربر رو از دست بدی.
  • پیچیده‌سازی بی‌مورد: گاهی وقت‌ها یه Regex خیلی پیچیده برای یه کار ساده نوشته میشه. سعی کن همیشه از ساده‌ترین و خواناترین Regex که کار رو راه میندازه استفاده کنی. پیچیدگی زیاد، احتمال خطا رو بالا میبره و نگهداری کد رو سخت می‌کنه.

اگه حس می‌کنی تو این مسیر نیاز به کمک داری یا به یه مشکل پیچیده خوردی، همیشه می‌تونی با تیم فنی ما تماس بگیری. ما اینجا هستیم تا کمکت کنیم مشکلاتتو حل کنی.

عیب‌یابی سریع: مشکلات رایج و راه‌حل‌ها

هیچ پروژه‌ای بدون چالش نیست! تو کار با Regex هم ممکنه به مشکلاتی بخوری. اینجا چند تا از مشکلات رایج و راه حل‌های سریعشون رو آوردم:

1. Regex کار نمی‌کنه و هیچ چیزی رو پیدا نمی‌کنه (False Negatives)

  • مشکل احتمالی:
    • Anchor‌ها (`^` و `$`): اگه رشته حاوی کاراکترهای اضافی قبل یا بعد از الگو باشه و شما از این Anchor‌ها استفاده کرده باشین، تطابقی صورت نمی‌گیره.
    • Escaping کاراکترهای خاص: اگه کاراکترهایی مثل `.`، `+`، `*` و … رو در Regexتون به صورت literal (یعنی دقیقاً همون کاراکتر) می‌خوایین استفاده کنین، باید اون‌ها رو با “ اسکیپ (Escape) کنین. مثلاً `+98` به جای `+98`.
    • تغییر الگو: یه اشتباه تایپی کوچک در الگو می‌تونه کل Regex رو خراب کنه.
  • راه‌حل:
    • اگه فقط می‌خوای الگو در جایی از رشته وجود داشته باشه، Anchor‌ها رو بردار.
    • همه کاراکترهای خاصی که به صورت Literal باید استفاده بشن رو اسکیپ کن.
    • Regex رو تو یه Regex Tester آنلاین مثل `regex101.com` یا `regexr.com` تست کن تا اشتباهات تایپی و منطقی رو پیدا کنی.

2. Regex موارد اشتباه رو هم قبول می‌کنه (False Positives)

  • مشکل احتمالی:
    • Regex خیلی کلی: الگو به اندازه کافی دقیق نیست و شامل مواردی میشه که نباید.
    • کوانتیفایر نامناسب: استفاده از `*` به جای `+` یا `?` می‌تونه باعث بشه تطابق‌هایی ایجاد بشن که انتظارش رو نداری.
    • فراموش کردن الگوریتم‌های تکمیلی: برای کد ملی، Regex تنها کافی نیست و باید الگوریتم کنترلی رو هم اعمال کنی.
  • راه‌حل:
    • الگوی Regex رو دقیق‌تر کن. برای مثال، برای شماره موبایل، محدود کردن پیش‌شماره‌ها (مثلاً فقط 0910 تا 0999).
    • از کوانتیفایرهای مناسب و دقیق‌تر مثل `{n}` یا `{n,m}` استفاده کن.
    • برای کد ملی، حتماً از الگوریتم محاسباتی رقم کنترل در کنار Regex استفاده کن.

3. عملکرد کند Regex (Performance Issues)

  • مشکل احتمالی:
    • Catastrophic Backtracking: Regex خیلی پیچیده و حریص، به خصوص با گروه‌های تودرتو و کوانتیفایرهای `*` یا `+` روی رشته‌های طولانی.
    • تست‌های مکرر: اجرای مکرر Regex روی یک رشته یا در یک حلقه بی‌مورد.
  • راه‌حل:
    • Regex رو ساده‌تر کن. از گروه‌های non-capturing `(?:…)` استفاده کن اگه نیازی به گرفتن اون بخش نداری.
    • از کوانتیفایرهای Lazy (`*?`, `+?`) استفاده کن تا Backtracking کاهش پیدا کنه.
    • قبل از اعمال Regex پیچیده، با یه Regex ساده‌تر و سریع‌تر طول و کاراکترهای کلی رشته رو چک کن.

جمع‌بندی

خب رفیق، رسیدیم به پایان این سفر جذاب تو دنیای اعتبار‌سنجی با Regex. دیدی که چطور با این ابزار قدرتمند می‌تونیم شماره موبایل و کد ملی رو، حتی با پیچیدگی‌های خاص خودشون، به راحتی اعتبارسنجی کنیم. نکته کلیدی اینه که Regex یه ابزار عالی برای بررسی ساختار داده‌هاست، اما برای اعتبار‌سنجی کامل مثل کد ملی، باید اون رو با منطق برنامه‌نویسی و الگوریتم‌های خاص خودش ترکیب کنیم.

همیشه یادت باشه که اعتبار‌سنجی دقیق، فقط یه کار فنی نیست، بلکه یه سرمایه‌گذاری برای کیفیت داده‌ها، امنیت سیستم و رضایت کاربرات محسوب میشه. پس هیچوقت ازش غافل نشو و همیشه سعی کن بهترین و کامل‌ترین روش‌ها رو برای اعتبار‌سنجی اطلاعاتت به کار ببری. امیدوارم این مقاله برات مفید بوده باشه و بتونی با اعتماد به نفس بیشتری از Regex تو پروژه‌هات استفاده کنی. دمت گرم که تا اینجا همراه ما بودی!

سوالات متداول (FAQ Schema)

سوال: آیا Regex به تنهایی برای اعتبار‌سنجی کد ملی کافی است؟

خیر، Regex تنها می‌تواند ساختار کد ملی (10 رقم عددی بودن) را بررسی کند. برای اعتبار‌سنجی کامل و مطمئن کد ملی، حتماً باید از الگوریتم محاسباتی رقم کنترل نیز در کنار Regex استفاده کنید.

سوال: چگونه می‌توانم شماره موبایل را با فرمت‌های مختلف (با صفر، بدون صفر، با +98) اعتبار‌سنجی کنم؟

شما می‌توانید از یک Regex انعطاف‌پذیر استفاده کنید که هر سه حالت را پوشش دهد. برای مثال، الگو `^(+98|0)?9d{9}$` هم شماره‌های 09xxxxxxxxx و هم +989xxxxxxxxx و هم 9xxxxxxxxx را قبول می‌کند.

سوال: منظور از “Catastrophic Backtracking” در Regex چیست و چگونه آن را رفع کنیم؟

“Catastrophic Backtracking” زمانی رخ می‌دهد که Regex خیلی پیچیده و حریص، مخصوصاً با کوانتیفایرهای نامحدود (`*`, `+`) و گروه‌های تودرتو، روی یک رشته طولانی به بن‌بست بخورد و زمان زیادی برای جستجو صرف کند. برای رفع آن، می‌توانید Regex را ساده‌تر کنید، از گروه‌های non-capturing `(?:…)` و کوانتیفایرهای Lazy (`*?`, `+?`) استفاده کنید.

سوال: آیا استفاده از Regex برای اعتبار‌سنجی سمت کاربر (Client-side) امن است؟

Regex سمت کاربر (با JavaScript) برای بهبود تجربه کاربری و بازخورد سریع به کاربر عالی است. اما همیشه باید اعتبار‌سنجی نهایی را سمت سرور (Server-side) نیز انجام دهید. اطلاعاتی که از سمت کاربر می‌آید همیشه قابل دستکاری است و هرگز نباید بدون اعتبار‌سنجی سمت سرور به آن‌ها اعتماد کرد.

آموزش اعتبار‌سنجی (Validation) شماره موبایل و کد ملی با Regex

ورود داده‌های نامعتبر یکی از بزرگ‌ترین چالش‌ها در فرم‌های وب و اپلیکیشن‌ها است. کاربران ممکن است به اشتباه یا به عمد، شماره موبایل یا کد ملی خود را با فرمتهای نادرست وارد کنند. استفاده از عبارت‌های منظم (Regex) یکی از سریع‌ترین و بهینه‌ترین روش‌ها برای اعتبارسنجی ورودی‌های کاربر در همان ابتدای کار است. در این مقاله جامع و کابردی، یاد می‌گیریم که چطور با استفاده از الگوهای دقیق Regex، صحت شماره موبایل و کد ملی ایرانی را بررسی کنیم. همچنین با ارائه کدهای آماده و روش‌های بهینه‌سازی فرم‌ها، تجربه کاربری سایت شما را به شدت بهبود می‌بخشیم.

خلاصه کاربردی: الگوهای طلایی Regex

اگر زمان کمی دارید، از این الگوهای آماده برای پروژه‌های خود استفاده کنید:

  • ✔ فرمت ساده شماره موبایل: ^09d{9}$
  • ✔ فرمت پیشرفته شماره موبایل (با پیش‌شماره ایران): ^(0|0098|+98)?9d{9}$
  • ✔ فرمت ۱۰ رقمی کد ملی: ^d{10}$

چرا اعتبار‌سنجی با Regex اهمیت دارد؟

وقتی کاربر اطلاعاتی مثل شماره موبایل یا کد ملی را در سایتی وارد می‌کند، اگر سیستم در همان لحظه درستی ساختار ورودی را ارزیابی نکند، پایگاه داده با حجم زیادی از اطلاعات معیوب پر می‌شود. برای مثال، ارسال پیامک تأیید به شماره‌های نامعتبر هم هزینه اضافه به شما تحمیل می‌کند و هم نرخ تبدیل مشتریان را کاهش می‌دهد.

عبارت‌های منظم (Regular Expressions) به ما این امکان را می‌دهند که بدون نیاز به نوشتن کدهای شرطی طولانی و پیچیده، ساختار دقیق ورودی را در یک خط کد ارزیابی کنیم. با ترکیب اعتبار سنجی فرانت‌اند و بک‌اند، یک لایه دفاعی قوی برای فرم‌های خود ایجاد می‌کنید. برای طراحی فرم‌های زیبا و بررسی رفتارهای ظاهری فیلدها می‌توانید از کدهای بخش سنیپت‌های CSS برای استایل‌دهی به وضعیت‌های معتبر و نامعتر ورودی‌ها کمک بگیرید.

اعتبار‌سنجی شماره موبایل ایران با Regex

شماره موبایل در ایران فرمت‌های گوناگونی دارد که ناشی از نحوه ورود اطلاعات توسط کاربران مختلف است. برخی از افراد شماره خود را با صفر شروع می‌کنند، برخی با کد کشور (+98 یا 0098) و برخی نیز شماره را بدون صفر و صرفاً با عدد 9 می‌نویسند. برای ایجاد یک تجربه کاربری عالی، سیستم شما باید تمامی این حالت‌ها را شناسایی کرده و بپذیرد.

تحلیل فرمت‌های مختلف شماره موبایل در ایران

به‌طور کلی، الگوهای پذیرفته‌شده برای یک شماره تلفن همراه معتبر ایرانی به شرح زیر است:

  • فرمت استاندارد: 09123456789 (۱۱ رقم)
  • فرمت بین‌المللی با پلاس: +989123456789 (۱۲ کاراکتر)
  • فرمت بین‌المللی با دو صفر: 00989123456789 (۱۴ رقم)
  • فرمت بدون صفر ابتدایی: 9123456789 (۱۰ رقم)

الگوهای مختلف Regex برای شماره موبایل

بسته به این که چقدر مایل هستید کنترل سخت‌گیرانه‌ای روی ورودی‌ها داشته باشید، می‌توانید یکی از الگوهای زیر را انتخاب کنید:

۱. الگوی ساده و عمومی (پیشنهادی برای اکثر فرم‌ها)

این الگو تمام حالت‌های رایج شماره موبایل شامل پیش‌شماره‌های مختلف ایران را پوشش می‌دهد:

^(0|0098|+98)?9d{9}$

توضیح الگو: بخش اول ^(0|0098|+98)? مشخص می‌کند که شماره می‌تواند با صفر، 0098، +98 آغاز شود یا کلاً این بخش حذف شده باشد (به دلیل علامت سوال آخر). در بخش دوم 9d{9}$ تأکید می‌شود که شماره حتما باید با عدد 9 شروع شده و متعاقباً دقیقاً ۹ رقم بعد از آن بیاید.

۲. الگوی سخت‌گیرانه (بررسی دقیق پیش‌شماره اپراتورها)

اگر می‌خواهید مطمئن شوید پیش‌شماره‌های معتبر اپراتورهای همراه اول، ایرانسل، رایتل، شاتل موبایل و تالیا به درستی وارد شده‌اند:

^(0|0098|+98)?9(0[1-5]|[13]d|2[0-3]|9[0-9]|41)d{7}$

پیاده‌سازی در زبان‌های برنامه‌نویسی

شما می‌توانید این الگوها را در تمام لایه‌های پروژه خود اعمال کنید. در ادامه نمونه کدهای کاربردی برای توسعه‌دهندگان آماده شده است.

پیاده‌سازی در جاوا اسکریپت (سمت کلاینت):

با استفاده از متد test() در جاوا اسکریپت، به راحتی ورودی کاربر را ارزیابی کنید. برای تماشای کدهای تکمیلی فرانت‌اند، حتما به آرشیو سنیپت‌های JS سر بزنید.

function validateMobile(mobileNumber) {
    const regex = /^(0|0098|+98)?9d{9}$/;
    return regex.test(mobileNumber);
}

// تست تابع
console.log(validateMobile("09121234567")); // خروجی: true
console.log(validateMobile("+989351234567")); // خروجی: true
console.log(validateMobile("123456")); // خروجی: false

پیاده‌سازی در پایتون (سمت سرور):

پایتون ابزاری بسیار قدرتمند برای اعتبارسنجی ورودی‌های ارسالی به سرور (Backend) است. برای توسعه پروژه‌های بک‌اند خود می‌توانید از الگوهای موجود در سنیپت‌های پایتون نیز ایده بگیرید.

import re

def validate_mobile(mobile):
    pattern = r"^(0|0098|+98)?9d{9}$"
    if re.match(pattern, mobile):
        return True
    return False

# تست متد
print(validate_mobile("09123456789")) # خروجی: True
print(validate_mobile("0912abc"))     # خروجی: False

برای پیاده‌سازی سریع این فیلترها در پروژه‌های وردپرسی، ابزارها و فیلترهای جذابی وجود دارند که کدهای آماده آن‌ها در صفحه سنیپت‌های وردپرس به صورت رایگان قرار گرفته است. همچنین برای پیاده‌سازی فرم‌های استاندارد در صفحات ایستای وب، الگوهای آماده تگ فرم را در بخش سنیپت‌های HTML بیابید.

اعتبار‌سنجی کد ملی ایران با Regex

کد ملی ایرانیان یک رشته ۱۰ رقمی منحصربه‌فرد است. برعکس شماره موبایل، برای کد ملی صرفاً بررسی تعداد کاراکترها و فرمت عددی کافی نیست. هر کد ملی از یک ساختار ریاضی خاص پیروی می‌کند که از ایجاد شماره‌های تصادفی جلوگیری می‌کند.

ساختار استاندارد کد ملی ایران

یک کد ملی از سه بخش کلی تشکیل شده است:

  • ۳ رقم اول: کد شهرستان صادرکننده کارت ملی
  • ۶ رقم بعدی: یک شماره سریال منحصربه‌فرد
  • رقم دهم (آخر): رقم کنترلی (Check Digit) که صحت ۹ رقم قبلی را مشخص می‌کند.

الگوی Regex برای بررسی ساختار اولیه کد ملی

قبل از اجرای محاسبات ریاضی سنگین روی سرور، ابتدا باید با استفاده از Regex مطمئن شویم ورودی کاربر دقیقاً ۱۰ رقم عددی است. برخی کدهای ملی با صفر یا دو صفر شروع می‌شوند، بنابراین باید دقت کنیم که این صفرها حذف نشوند.

^d{10}$

الگوی بالا ساده‌ترین راه است. اگر بخواهیم جلوی ورود شناسه‌هایی که همه ارقام آنها یکسان هستند را (مانند 1111111111 یا 0000000000) با Regex بگیریم، می‌توانیم از الگوی زیر بهره ببریم:

^(?!(d)1{9})d{10}$

الگوریتم صحت‌سنجی ریاضی کد ملی

بعد از برسی فرمت ۱۰ رقمی ورودی، نوبت به پیاده‌سازی الگوریتم ریاضی می‌رسد. این فرآیند به صورت گام‌به‌گام به شرح زیر است:

  1. هر یک از ۹ رقم اول را در موقعیت مکانی آن ضرب می‌کنیم (رقم اول ضرب در ۱۰، رقم دوم ضرب در ۹، … و رقم نهم ضرب در ۲).
  2. مجموع تمام حاصل‌ضرب‌ها را محاسبه می‌کنیم.
  3. باقیمانده تقسیم مجموع حاصل‌ضرب‌ها بر عدد ۱۱ را محاسبه می‌کنیم (باقیمانده = مجموع % ۱۱).
  4. اگر باقیمانده کمتر از ۲ باشد، رقم دهم (کنترلی) باید برابر خود باقیمانده باشد.
  5. اگر باقیمانده بزرگتر یا مساوی ۲ باشد، رقم دهم باید برابر با (۱۱ منهای باقیمانده) باشد.

پیاده‌سازی الگوریتم کامل در جاوا اسکریپت:

function validateNationalCode(code) {
    // بررسی فرمت 10 رقمی و عدم تکرار ارقام یکسان
    if (!/^d{10}$/.test(code) || /(d)1{9}/.test(code)) return false;

    let sum = 0;
    for (let i = 0; i < 9; i++) {
        sum += parseInt(code.charAt(i)) * (10 - i);
    }

    const remainder = sum % 11;
    const lastDigit = parseInt(code.charAt(9));

    if (remainder < 2) {
        return lastDigit === remainder;
    } else {
        return lastDigit === (11 - remainder);
    }
}

// مثال‌های تست
console.log(validateNationalCode("0012345678")); // احتمال بالا به دلیل ساختگی بودن نادرست است (false)

جدول مقایسه روش‌های اعتبارسنجی

برای این که تصمیم بگیرید چه سطحی از اعتبارسنجی را برای پروژه‌های خود انتخاب کنید، جدول مقایسه‌ای زیر به شما دید بهتری می‌دهد:

روش اعتبارسنجی بهترین کابردهای هر متد
اعتبارسنجی سمت کلاینت (HTML5 & Regex) بررسی آنی و سریع ساختار برای جلوگیری از خطای سهوی کاربر در فرم.
اعتبارسنجی سمت سرور (الگوریتم‌های ریاضی) تأیید نهایی، اطمینان از اصالت اطلاعات دریافتی، حفاظت از پایگاه داده و جلوگیری از هک.
اعتبارسنجی دو مرحله‌ای (SMS OTP) تأیید هویت قطعی مالک شماره موبایل پس از تأیید اولیه ساختار توسط الگوهای منظم.

عیب‌یابی سریع و رفع خطاهای رایج

در حین پیاده‌سازی سیستم‌های اعتبارسنجی ممکن است با مشکلات عجیبی روبه‌رو شوید. در این بخش، چند مورد از متداول‌ترین خطاها و راه‌حل‌های عملی برای رفع آن‌ها را بررسی می‌کنیم.

مشکل ۱: رد شدن شماره‌های موبایل به دلیل وارد کردن اعداد فارسی یا عربی

بسیاری از کیبوردهای گوشی همراه به صورت پیش‌فرض اعداد را به شکل فارسی (۱۲۳) یا عربی تایپ می‌کنند. الگوهای کلاسیک Regex مانند d یا [0-9] این اعداد را نامعتبر تلقی می‌کنند.

👉 راه حل: قبل از اجرای ارزیابی Regex با یک تابع ساده، اعداد فارسی و عربی را به انگلیسی تبدیل کنید. در صفحه کدهای آماده و سنیپت‌ها می‌توانید کدهای متنوعی برای انجام خودکار این فرآیند پیدا کنید.

مشکل ۲: کدهای ملی با رقم‌های تکراری نامعتبر مانند “۱۱۱۱۱۱۱۱۱۱” تأیید می‌شوند!

گاهی اوقات کاربران تنبل برای رد شدن سریع از مراحل فرم، عددی تکراری وارد می‌کنند. فرمول ریاضی کدملی این اعداد را بررسی نمی‌کند و ممکن است معتبر شناسایی شوند.

👉 راه حل: حتماً قبل از اجرای الگوریتم ریاضی، شرط عدم تکرار تمامی کاراکترها را با استفاده از الگوی Regex بالا ^(?!(d)1{9})d{10}$ بررسی نمایید.

سوالات متداول (FAQ)

آیا Regex به تنهایی برای اعتبارسنجی کدملی کافی است؟

خیر. الگوهای Regex فقط ساختار ظاهری (مثلاً تعداد ۱۰ رقم یا عددی بودن) را تأیید می‌کنند. برای صحت‌سنجی ۱۰۰ درصدی کارت ملی، پیاده‌سازی الگوریتم ریاضی بررسی رقم دهم کاملاً ضروری است.

تفاوت الگوی موبایل ساده با الگوی سخت‌گیرانه چیست؟

الگوی ساده پذیرای هر شماره‌ای است که پس از صفر یا پیش‌شماره ایران با عدد ۹ شروع شده و ۱۱ رقم باشد. الگوی سخت‌گیرانه، پیش‌شماره‌های خاص هر اپراتور نظیر همراه اول (۹۱۲، ۹۱۱، …) یا ایرانسل (۹۳۵، ۹۳۶، …) را مو به مو فیلتر کرده و کدهای فیک را فورا ریجکت می‌کند.

چگونه ورودی‌های فارسی را همزمان در دسکتاپ و موبایل معتبر کنیم؟

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

{
“@context”: “https://schema.org”,
“@type”: “FAQPage”,
“mainEntity”: [
{
“@type”: “Question”,
“name”: “آیا Regex به تنهایی برای اعتبارسنجی کدملی کافی است؟”,
“acceptedAnswer”: {
“@type”: “Answer”,
“text”: “خیر. الگوهای Regex فقط ساختار ظاهری را بررسی می‌کنند. برای صحت‌سنجی نهایی، پیاده‌سازی الگوریتم ریاضی بررسی رقم کنترلی دهم الزامی است.”
}
},
{
“@type”: “Question”,
“name”: “تفاوت الگوی موبایل ساده با الگوی سخت‌گیرانه چیست؟”,
“acceptedAnswer”: {
“@type”: “Answer”,
“text”: “الگوی ساده پذیرای هر شماره ۱۱ رقمی است که پس از صفر با ۹ شروع شود. اما الگوی سخت‌گیرانه، پیش‌شماره‌های رسمی هر اپراتور ایرانی (ایرانسل، همراه اول و غیره) را مو به مو بررسی و تایید می‌کند.”
}
},
{
“@type”: “Question”,
“name”: “چگونه ورودی‌های فارسی را همزمان در دسکتاپ و موبایل معتبر کنیم؟”,
“acceptedAnswer”: {
“@type”: “Answer”,
“text”: “بهترین روش، تبدیل کاراکترهای فارسی و عربی اعداد به اعداد انگلیسی در فرانت‌اند، قبل از انجام فرآیند اعتبارسنجی Regex است.”
}
}
]
}

Table of Contents

آخرین نوشته‌ها

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *