Chiquvchi qo'ng'iroqlar

Foydalanuvchilar uchun chiquvchi qo'ng'iroqlarni yo'naltirish qoidalarini sozlash

Bu nima?

Chiquvchi qo'ng'iroq qoidalari — tizim foydalanuvchilari chiquvchi qo'ng'iroq qilganda, qaysi yo'nalish (trunk) orqali va qanday raqam formatida chiqishini boshqarish uchun ishlatiladi.


Bu nima uchun kerak?

Turli vaziyatlarda chiquvchi qo'ng'iroqlarni alohida yo'naltirishga ehtiyoj tug'iladi:

  • Shahar raqamlariga bir trunk, mobil raqamlarga boshqa trunk orqali chiqish
  • Xorijiy raqamlarga faqat ma'lum foydalanuvchilar qo'ng'iroq qila olishi
  • Raqamni trunk talab qiladigan formatga keltirish (trunklar odatda 9 xonali raqamni qabul qiladi, masalan: 0901234567 → trunkka 901234567)
  • Bir nechta trunk mavjud bo'lganda yukni teng taqsimlash (random tanlash)

Maydonlar

Tartib raqamisort_id
Qoidalar tekshiriladigan tartib. Kichik raqamli qoida birinchi tekshiriladi. Bir nechta qoida mos kelishi mumkin bo'lsa — faqat birinchi mos kelgan qoida ishlatiladi.
Nomititle
Qoidaning tavsifi. Masalan: Shahar raqamlari, Mobil — Beeline trunk, Xorijiy chiquvchi
Regex patternregex
Qaysi raqamlarga qo'ng'iroq qilinganda bu qoida ishlashi. Pattern / belgilari ichida yoziladi. Masalan: /^998\d{9}$/
Trunk uchun almashtirishrewrite_trunk
Raqamni trunkga yuborishdan oldin qaysi formatga o'tkazish. Aynan shu raqam trunk orqali tashqi tarmoqqa chiqadi. $1, $2 — pattern guruhlariga ishora. Standart qiymat: $1 (raqam o'zgarishsiz yuboriladi).
CDR uchun almashtirishrewrite_cdr
Raqamni qo'ng'iroqlar tarixiga (CDR) yozishdan oldin qaysi formatga o'tkazish. Bu raqam statistikada va call_history jadvalida ko'rinadi. $1, $2 — pattern guruhlariga ishora. Standart qiymat: $1 (raqam o'zgarishsiz yoziladi).
Chiquvchi yo'nalishlarexternal_numbers
Qo'ng'iroq chiqadigan trunk(lar) ro'yxati. Bir nechta ko'rsatilsa — tasodifiy biri tanlanadi (yukni taqsimlash uchun).
Foydalanuvchilarusers
Bu qoida qaysi ichki raqamlarga (foydalanuvchilarga) tegishli ekanligini belgilaydi.

Qanday ishlaydi?

Foydalanuvchi 101 → 0901234567 ga qo'ng'iroq qiladi

Qoida (tartib: 1):
  Foydalanuvchilar:         [101, 102, 103]
  Regex pattern:            /^0(\d{9})$/
  Trunk uchun almashtirish: $1
  CDR uchun almashtirish:   998$1
  Chiquvchi yo'nalishlar:   [beeline-trunk, ucell-trunk]

1. Foydalanuvchi (101) ro'yxatda bor? ✓
2. Raqam (0901234567) pattern ga mos? ✓
3. Trunk uchun almashtirish: 0901234567 → 901234567   (trunk uchun 9 xonali)
4. CDR uchun almashtirish:   0901234567 → 998901234567 (tarixga to'liq xalqaro format)
5. Tasodifiy trunk: beeline-trunk

Natija:
  Trunkka chiqadi:    901234567@beeline-trunk
  Tarixga yoziladi:   998901234567

Qoidalar tartib raqami bo'yicha birma-bir tekshiriladi. Birinchi mos kelgan qoida ishga tushadi va qolgan qoidalar tekshirilmaydi.


Nima uchun ^, $ va () kerak?

Bu — eng ko'p xato qilinadigan joy. Quyida aniq misollar bilan tushuntirilgan.

^ va $ — chegara belgilari

^ va $ belgilarsiz pattern raqamning istalgan joyida mos kelishi mumkin.

Misol: /998\d{9}/ — anchorsiz pattern

Kirish raqamMos keladimi?Nima uchun?
998901234567To'g'ri
998901234567qo'shimcha✓ ← xato!Oxiridagi belgilar e'tiborga olinmaydi
prefix998901234567✓ ← xato!Oldingi belgilar e'tiborga olinmaydi
998901234567890✓ ← xato!15 xonali raqam ham mos keladi

Misol: /^998\d{9}$/ — to'g'ri, ^ va $ bilan

Kirish raqamMos keladimi?Nima uchun?
998901234567To'g'ri — aniq 12 ta belgi
998901234567qo'shimcha$ oxirni tekshiradi
prefix998901234567^ boshni tekshiradi
99890123456789012 ta belgidan ortiq — mos kelmaydi

() — almashtirish uchun guruh

Agar raqamni qayta yozmoqchi ($1, 998$1 va h.k.) bo'lsangiz, pattern'da guruh () bo'lishi shart. Bir xil pattern guruhlari ikkala almashtirishda (rewrite_trunk va rewrite_cdr) bir xilda ishlaydi. Aks holda $1 bo'sh bo'ladi.

Misol: kiritilgan 0901234567 — trunkka 9 xonalik (901234567), tarixga to'liq (998901234567)

❌ Xato:  /^0\d{9}$/   → rewrite_trunk: $1
          $1 guruhi yo'q → natija bo'sh  ← noto'g'ri!

✓ To'g'ri: /^0(\d{9})$/ → rewrite_trunk: $1     → "901234567"
                          rewrite_cdr:   998$1  → "998901234567"

Almashtirish kerak bo'lmasa (raqam o'zgarishsiz ketsa), guruh shart emas — almashtirish maydonlarini $1 qilib qoldiring.


Regex va almashtirish qoidalari

Pattern har doim / belgilari ichida yoziladi: /pattern/

BelgiNima qiladiMisol patternNima mos keladi
^Satr boshidan boshlanishi/^998/998901234567 — ha
$Satr oxiri bilan tugashi/\d{9}$/9 raqam bilan tugaydi
^ + $Aniq shu format (boshqa belgi yo'q)/^\d{12}$/Faqat 12 xonali raqam
\dIstalgan bitta raqam (0–9)/\d/0, 5, 9
\d{n}Aniq n ta raqam/\d{9}/9 xonali istalgan raqam
()Guruh — almashtirish'da $1, $2 sifatida olinadi/^0(\d+)$/0901... → guruh 901...
?Oldingi belgi bo'lishi ham, bo'lmasligi ham mumkin/^\+?998/+998... ham, 998... ham
(a|b)a yoki b/(90|91)\d{7}/90 yoki 91 bilan boshlanadi
.+Istalgan raqam (kamida 1 belgi)/^(.+)$/Barcha raqamlar — catch-all sifatida ishlatish tavsiya etiladi
.*Istalgan raqam (bo'sh satr ham mos keladi)/.*/Barcha raqamlar — ⚠️ almashtirishda ikki marta match berishi mumkin

Almashtirish (rewrite) belgilari

Quyidagi belgilar rewrite_trunk va rewrite_cdr maydonlariga bir xil tarzda qo'llaniladi.

BelgiNimaMisol
$1Patternning 1-guruhi (...)/^0(\d+)$/998$1
$2Patternning 2-guruhi/^(\d{3})(\d+)$/$1-$2
$1Guruh bo'lmasa — raqam o'zgarishsiz/^998\d{9}$/$1

Misollar

Trunk 9 xonali raqamni qabul qiladi degan taxminda — pattern'ga 9 xonali qismni guruhga oladi ((...)), so'ng rewrite_trunk = $1 (trunkka 9 xonalik chiqadi), rewrite_cdr = 998$1 (tarixga to'liq xalqaro format yoziladi).

VaziyatFoydalanuvchilarRegex patternTrunk uchunCDR uchunChiquvchi yo'nalishlar
Local format (0XXX…) — trunkka 9 xonalikBarchasi/^0(\d{9})$/$1998$1[ucell-trunk, beeline-trunk]
Xalqaro format (998XXX…) — trunkka 9 xonalikBarchasi/^998(\d{9})$/$1998$1[mobile-trunk]
+998… ham, 998… ham qo'llab-quvvatlanadiBarchasi/^\+?998(\d{9})$/$1998$1[mobile-trunk]
Beeline mobil (90, 91) — alohida trunk[101, 102]/^998(9[01]\d{7})$/$1998$1[beeline-trunk]
Shahar raqamlari (71) — IP-telefoniya trunkBarchasi/^998(71\d{7})$/$1998$1[city-trunk]
Xorijiy chiquvchi — trunkka 00 prefiks[201, 202]/^(?:00|\+)?(\d{6,})$/00$1$1[international-trunk]
Yukni teng taqsimlash, hech narsani o'zgartirmaslikBarchasi/^(.+)$/$1$1[trunk-1, trunk-2, trunk-3]

Eslatmalar

  • Qoidalar tartib raqami bo'yicha tekshiriladi — aniqroq qoidalarni kichikroq tartib raqami bilan joylashtiring (masalan: aniq raqam → tartib 1, umumiy qoida → tartib 10).
  • Foydalanuvchi bir nechta qoidaning Foydalanuvchilar ro'yxatida bo'lishi mumkin — faqat birinchi mos kelgani ishlatiladi.
  • Chiquvchi yo'nalishlar da bir nechta trunk ko'rsatilsa, har bir qo'ng'iroqda tasodifiy biri tanlanadi — bu yukni teng taqsimlash imkonini beradi.
  • Barcha qoidalar bitta so'rovda saqlanadi (massiv sifatida). Saqlashda eski barcha qoidalar o'chiriladi va yangilari yoziladi.
  • Qoidalar ro'yxati bo'sh yuborilsa — barcha qoidalar o'chib, chiquvchi qo'ng'iroqlar to'xtatiladi.

Regexlarni sinash