Asosiy kontentga o‘tish
Innovialabs

Regulyar ifodalar amalda: telefon, email va URL tekshiruvi

Amaliyot3 daq

Qisqacha

Regex mavjudlikni emas, formatni tekshiradi: telefonni raqamlarga keltirib shablon bilan, emailni oddiy shablon va tasdiqlash xati bilan, URL’ni esa ichki parser bilan tekshiring.

Qisqa javob

Regulyar ifoda faqat «bu telefon, email yoki havolaga o‘xshaydimi» degan savolga javob beradi. U raqam mavjudligini, xatlar yetib borishini yoki sayt ochilishini aytmaydi. Shuning uchun ishchi sxema quyidagicha:

  1. Kiritilganni normallashtirish — bo‘sh joylar, qavslar va defislarni olib tashlash.
  2. Formatni oddiy va tushunarli shablon bilan tekshirish.
  3. Haqiqiyligini tasdiqlash — SMS-kod, havolali xat, saytga so‘rov.
  4. Tekshiruvni serverda takrorlash: mijoz tomonidagi validatsiyani aylanib o‘tish oson.

O‘zbekiston telefon raqamlari (+998)

O‘zbekistondagi raqam — 998 davlat kodi va yana 9 ta raqam: ikki xonali operator yoki hudud kodi va yetti xonali abonent raqami. Odamlar uni turlicha kiritadi: +998 90 123 45 67, 998901234567, (90) 123-45-67.

Eng ishonchli yo‘l — avval faqat raqamlarni qoldirish, keyin tekshirish:

function normalizeUzPhone(input) {
  const digits = input.replace(/\D/g, "");
  if (/^998\d{9}$/.test(digits)) return "+" + digits;
  if (/^\d{9}$/.test(digits)) return "+998" + digits;
  return null;
}

normalizeUzPhone("(90) 123-45-67"); // "+998901234567"
normalizeUzPhone("12345");          // null

Agar raqamni normallashtirmasdan, «foydalanuvchi kiritganidek» tekshirish kerak bo‘lsa, quyidagi shablon mos keladi:

^(?:\+?998)?[\s-]?\(?\d{2}\)?[\s-]?\d{3}[\s-]?\d{2}[\s-]?\d{2}$

Raqamni bitta formatda saqlang — +998XXXXXXXXX (E.164). Shunda dublikatlarni topish va raqamni SMS-shlyuzlar hamda CRM’ga uzatish osonroq.

Operator kodlari ro‘yxatini regexga qotirib qo‘ymang: yangi kodlar qo‘shiladi va forma haqiqiy raqamlarni rad eta boshlaydi. Kodlarni tekshirish chindan kerak bo‘lsa, ro‘yxatni konfiguratsiyada saqlang.

Email

Elektron pochta manzilining to‘liq standarti shunchalik murakkabki, «mukammal» regex o‘qib bo‘lmas darajaga yetadi va baribir yetkazishni kafolatlamaydi. Amalda oddiy shablon yetarli:

const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;

EMAIL_RE.test("user@example.com"); // true
EMAIL_RE.test("user@localhost");   // false
EMAIL_RE.test("user @mail.com");   // false

U xatolarni — tushib qolgan @, bo‘sh joylar, domen yo‘qligini — ushlaydi va +, defis yoki subdomenli kam uchraydigan, ammo to‘g‘ri manzillarni rad etmaydi. Pochta qutisi mavjudligi faqat tasdiqlash xati bilan tekshiriladi.

Ko‘p uchraydigan xato — [a-z0-9.]+@[a-z]+\.[a-z]{2,3} kabi o‘ta qat’iy shablon. U + li manzillarni, ko‘p darajali domenlarni va uzun domen zonalarini rad etadi.

URL

Havolalar uchun regex yomon vosita: URL’ning qismlari, kodlashlari va chekka holatlari ko‘p. Ichki parserdan foydalaning va protokolni tekshiring:

function isHttpUrl(value) {
  try {
    const url = new URL(value);
    return url.protocol === "http:" || url.protocol === "https:";
  } catch {
    return false;
  }
}

Protokol tekshiruvi muhim: usiz javascript:... kabi havolalar o‘tib ketadi, ularni sahifaga qo‘yish xavfli. Parametrdan olingan havola bo‘yicha redirect qilsangiz, url.hostname ni ruxsat etilgan domenlar ro‘yxati bilan solishtiring.

Matndan havolalarni shunchaki topish uchun, masalan chat-bot xabarida, https?://[^\s<>"]+ kabi qo‘pol shablon yetarli.

Regex qayerda ojiz

  • Mavjudlik: raqam, pochta qutisi va sayt formati to‘g‘ri bo‘lsa ham, ishlamasligi mumkin.
  • Xalqaro manzillar: kirill yoki boshqa alifbodagi domenlar va emaillar ko‘pincha ASCII shablonlardan o‘tmaydi.
  • Biznes qoidalari: «faqat mobil raqamlar» yoki «faqat korporativ pochta» kabi shartlarni shablonni murakkablashtirmasdan, kodda tekshirgan ma’qul.
  • Xavfsizlik: regex XSS va SQL-inyeksiyalardan himoya qilmaydi — buning uchun ekranlash va parametrlangan so‘rovlar kerak.

Katastrofik backtracking

Ba’zi shablonlar noqulay satrda eksponensial uzoq ishlaydi va serverni bloklab qo‘yishi mumkin. Klassik misol:

^([a-z0-9]+\.?)+@

Ichma-ich kvantifikator va ixtiyoriy nuqta bir xil harflar qatorini juda ko‘p usulda bo‘lishga imkon beradi. @ siz uzun satrda dvijok ularning hammasini sinab chiqadi.

Qanday himoyalanish mumkin:

  • Bir xil belgilar ustida kvantifikatorlarni ichma-ich qo‘ymang. Xuddi shu shablonning xavfsiz varianti — ^[a-z0-9]+(?:\.[a-z0-9]+)*@: har bir takror nuqta bilan boshlanishi shart.
  • Regexni ishga tushirishdan oldin kiritish uzunligini cheklang.
  • Shablonlarni testlarda uzun, «deyarli mos» satrlarda tekshiring.
  • Shablonlar tashqaridan keladigan joylarda chiziqli murakkablikdagi dvijoklardan foydalaning, masalan RE2 yoki Go’dagi standart regexp paketi.

Ko‘p beriladigan savollar

Odatda 998 dan keyin aynan 9 ta raqam kelishini tekshirish yetarli. Qat’iy kodlar ro‘yxati tez eskiradi; raqam haqiqiyligini SMS-kod bilan tasdiqlagan ma’qul.

Bunda yordam beramiz

O‘zingiz shug‘ullanmasdan natija olishni istasangiz — biz har kuni shu bilan shug‘ullanamiz.

Loyihani muhokama qilish

Yana o‘qing

G‘oya yoki vazifangiz bormi? Bizga aytib bering

Ish kuni davomida javob beramiz va yechim taklif qilamiz. Konsultatsiya bepul.