Regulyar ifodalar amalda: telefon, email va URL tekshiruvi
Amaliyot3 daqInnovialabs tahririyati
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:
- Kiritilganni normallashtirish — bo‘sh joylar, qavslar va defislarni olib tashlash.
- Formatni oddiy va tushunarli shablon bilan tekshirish.
- Haqiqiyligini tasdiqlash — SMS-kod, havolali xat, saytga so‘rov.
- 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.
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
regexppaketi.