عبارت منظم - اعتبارسنجی شماره تلفن با جاوااسکریپت


من این کد را در یک وبسایت پیدا کردم و بهطور کامل کار میکند. این کد بررسی میکند که شماره تلفن در یکی از این قالبها باشد:
(123) 456-7890 یا 123-456-7890

مشکل این است که مشتری من (نمیدانم چرا، شاید مسئلههای مشتری) میخواهد یک فرمت دیگر اضافه کند، ده عدد پشت سر هم، چیزی شبیه این: 1234567890.

من از این عبارت منظم استفاده میکنم،

/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/

چطور میتوانم اضافه کنم که همچنین فرمت دیگری را هم اعتبارسنجی کند؟ من در استفاده از عبارات منظم خوب نیستم.

پاسخ شماره ۱

عبارت منظم انتخابی من این است:

/^[\+]?[0-9]{0,3}\W?+[(]?[0-9]{3}[)]?[-\s\.]?[0-9]{3}[-\s\.]?[0-9]{4,6}$/im

فرمتهای معتبر:

(123) 456-7890
(123)456-7890
123-456-7890
123.456.7890
1234567890
+31636363634
075-63546725
+1 (415)-555-1212
+1 (123) 456-7890
+1 (123)456-7890
+1 123-456-7890
+1 123.456.7890
+1 1234567890
+1 075-63546725
+12 (415)-555-1212
+12 (123) 456-7890
+12 (123)456-7890
+12 123-456-7890
+12 123.456.7890
+12 1234567890
+123 075-63546725
+123 (415)-555-1212
+123 (123) 456-7890
+123 (123)456-7890
+123 123-456-7890
+123 123.456.7890
+123 1234567890
+123 075-63546725
+1(415)-555-1212
+1(123) 456-7890
+1(123)456-7890
+1123-456-7890
+1123.456.7890
+11234567890
+1075-63546725
+12(415)-555-1212
+12(123) 456-7890
+12(123)456-7890
+12123-456-7890
+12123.456.7890
+121234567890
+123075-63546725
+123(415)-555-1212
+123(123) 456-7890
+123(123)456-7890
+123123-456-7890
+123123.456.7890
+1231234567890
+123075-63546725

پاسخ شماره ۲

اول از همه، تأییدکننده فرمت شما واضحاً فقط برای شمارههای NANP (کد کشور +1) مناسب است. آیا برنامه شما توسط کسی با شماره تلفن خارج از آمریکای شمالی استفاده خواهد شد؟ اگر چنین است، نمیخواهید مانع ورود آن افراد به یک شماره [بینالمللی] کاملاً معتبر شوید.

ثانیاً، اعتبارسنجی شما نادرست است. شمارههای NANP به شکل NXX NXX XXXX هستند که در آن N یک رقم بین ۲ تا ۹ و X یک رقم بین ۰ تا ۹ است. علاوه بر این، کدهای منطقهای و تبادلها نباید به شکل N11 باشند (با دو عدد یک پایان یابند) تا از سردرگمی با خدمات ویژه جلوگیری شود به جز شمارههایی که در کد منطقه غیرجغرافیایی (۸۰۰، ۸۸۸، ۸۷۷، ۸۶۶، ۸۵۵، ۹۰۰) هستند ممکن است تبادل N11 داشته باشند.

پس، عبارت منظم شما شماره (123) 123 4566 را قبول خواهد کرد، حتی اگر آن شماره تلفن معتبر نباشد. شما میتوانید این مشکل را با جایگزینی \d{3} با [2-9]{1}\d{2} حل کنید.

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

خلاصه: از عبارتهای منظم برای اعتبارسنجی دادههای واقعی و پیچیده مثل شماره تلفن یا آدرسهای اینترنتی استفاده نکنید. از یک کتابخانه تخصصی استفاده کنید.

پاسخ شماره ۳

اگر به دنبال ۱۰ و فقط ۱۰ رقم هستید، همه چیز به جز ارقام را نادیده بگیرید

   return value.match(/\d/g).length===10;

پاسخ شماره ۴

/^[+]*[(]{0,1}[0-9]{1,3}[)]{0,1}[-\s\./0-9]*$/g

(۱۲۳) ۴۵۶-۷۸۹۰
+(۱۲۳) ۴۵۶-۷۸۹۰
+(۱۲۳)-۴۵۶-۷۸۹۰
+(۱۲۳) - ۴۵۶-۷۸۹۰
+(۱۲۳) - ۴۵۶-۷۸-۹۰
۱۲۳-۴۵۶-۷۸۹۰
۱۲۳.۴۵۶.۷۸۹۰
۱۲۳۴۵۶۷۸۹۰
+۳۱۶۳۶۳۶۳۶۳۴
۰۷۵-۶۳۵۴۶۷۲۵

این یک گزینه بسیار آزاد است و من ترجیح میدهم همینطور نگهش دارم، بیشتر آن را در فرمهای ثبتنام استفاده میکنم جایی که کاربران نیاز دارند شماره تلفن خود را وارد کنند. معمولاً کاربران با فرمهایی که قوانین فرمتبندی سختگیرانه دارند مشکل دارند، من ترجیح میدهم کاربر شماره را وارد کند و آن را در نمایش یا قبل از ذخیره کردن در پایگاه داده قالببندی کنم. http://regexr.com/3c53v

پاسخ شماره ۵

کاری که من انجام میدهم این است که فرمت را نادیده بگیرم و محتوای عددی را اعتبارسنجی کنم:

var originalPhoneNumber = "415-555-1212";

function isValid(p) {
  var phoneRe = /^[2-9]\d{2}[2-9]\d{2}\d{4}$/;
  var digits = p.replace(/\D/g, "");
  return phoneRe.test(digits);
}

پاسخ شماره ۶

REGEX زیر هر یک از این فرمتها را معتبر میکند:

(123) 456-7890
123-456-7890
123.456.7890
1234567890

/^[(]{0,1}[0-9]{3}[)]{0,1}[-\s\.]{0,1}[0-9]{3}[-\s\.]{0,1}[0-9]{4}$/

پاسخ شماره ۷

جایی که str میتواند هر یک از این قالبها باشد: 555-555-5555 (555)555-5555 (555) 555-5555 555 555 5555 5555555555 1 555 555 5555

function telephoneCheck(str) {
  var isphone = /^(1\s|1|)?((\(\d{3}\))|\d{3})(\-|\s)?(\d{3})(\-|\s)?(\d{4})$/.test(str);
  alert(isphone);
}
telephoneCheck("1 555 555 5555");

پاسخ شماره ۸

من پیشنهاد میکنم از چیزی واضحتر استفاده کنید (خصوصاً با توجه به اینکه چه کسی باید از کد نگهداری کند)... نظرتان دربارهٔ این چیست:

var formats = "(999)999-9999|999-999-9999|9999999999";
var r = RegExp("^(" +
               formats
                 .replace(/([\(\)])/g, "\\$1")
                 .replace(/9/g,"\\d") +
               ")$");

جایی که عبارت منظم از یک قالب واضح ساخته شده است؟ افزودن یک مورد جدید در این صورت بسیار ساده خواهد بود و ممکن است حتی خود مشتری نیز قادر باشد این کار را در صفحه «گزینهها» انجام دهد.

پاسخ شماره ۹

این یکی را امتحان کنید - همچنین شامل اعتبارسنجی برای فرمتهای بینالمللی است.

/^[+]?(1\-|1\s|1|\d{3}\-|\d{3}\s|)?((\(\d{3}\))|\d{3})(\-|\s)?(\d{3})(\-|\s)?(\d{4})$/g

این regex فرمت زیر را اعتبارسنجی میکند:

  • (۵۴۱) ۷۵۴-۳۰۱۰ داخلی
  • +1-541-754-3010 بینالمللی
  • 1-541-754-3010 در ایالات متحده شمارهگیری شد
  • ۰۰۱-۵۴۱-۷۵۴-۳۰۱۰ از آلمان شمارهگیری شد
  • ۱۹۱ ۵۴۱ ۷۵۴ ۳۰۱۰ از فرانسه شمارهگیری شد

پاسخ شماره ۱۰


عبارت منظم

از الگوی Regex زیر استفاده کنید:

/^[\+]?[(]?[0-9]{3}[)]?[-\s\.]?[0-9]{3}[-\s\.]?[0-9]{4,6}$/im

مثل این: <input pattern="/^[\+]?[(]?[0-9]{3}[)]?[-\s\.]?[0-9]{3}[-\s\.]?[0-9]{4,6}$/im">*


فرمتهای معتبر:

(۱۲۳) ۴۵۶-۷۸۹۰,
(۱۲۳)۴۵۶-۷۸۹۰,
۱۲۳-۴۵۶-۷۸۹۰,
۱۲۳.۴۵۶.۷۸۹۰,
۱۲۳۴۵۶۷۸۹۰,
+۳۱۶۳۶۳۶۳۶۳۴ یا
۰۷۵-۶۳۵۴۶۷۲۵