Распознавание ИНН и длинных чисел в голосовых проектах


Рассказывает сотрудник техподдержки Рома Юдаков

Иногда клиентам требуется, чтобы по телефону был продиктован ИНН или другой набор чисел.

Часто пользователи диктуют числа в формате: сто двадцать три, пять нолей, семь. Подобный ввод трудно распознать регулярным выражением.


Ниже представлен код, который принимает переменну $queryText, содержащую всю фразу пользователя, и выводит в $all числовое значение.

11


function k4() {
  if ($one[$i] == "сто") {
    $kk1 = 100;
    $status = 4;
  } else if ($one[$i] == "двести") {
    $kk1 = 200;
    $status = 4;
  } else if ($one[$i] == "триста") {
    $kk1 = 300;
    $status = 4;
  } else if ($one[$i] == "четыреста") {
    $kk1 = 400;
    $status = 4;
  } else if ($one[$i] == "пятьсот") {
    $kk1 = 500;
    $status = 4;
  } else if ($one[$i] == "шестьсот") {
    $kk1 = 600;
    $status = 4;
  } else if ($one[$i] == "семьсот") {
    $kk1 = 700;
    $status = 4;
  } else if ($one[$i] == "восемьсот") {
    $kk1 = 800;
    $status = 4;
  } else if ($one[$i] == "девятьсот") {
    $kk1 = 900;
    $status = 4;
  }
}

function k5() {
  if ($one[$i] == "нуля" || $one[$i] == "нулей") {
    $kk1 = 0;
    $status = 5;
  } else if ($one[$i] == "еденицы" || $one[$i] == "едениц") {
    $kk1 = 1;
    $status = 5;
  } else if ($one[$i] == "двойки" || $one[$i] == "двоек") {
    $kk1 = 2;
    $status = 5;
  } else if ($one[$i] == "тройки" || $one[$i] == "троек") {
    $kk1 = 3;
    $status = 5;
  } else if ($one[$i] == "четверки" || $one[$i] == "четверок") {
    $kk1 = 4;
    $status = 5;
  } else if ($one[$i] == "пятерки" || $one[$i] == "пятерок") {
    $kk1 = 5;
    $status = 5;
  } else if ($one[$i] == "шестерки" || $one[$i] == "шестерок") {
    $kk1 = 6;
    $status = 5;
  } else if ($one[$i] == "семерки" || $one[$i] == "семерок") {
    $kk1 = 7;
    $status = 5;
  } else if ($one[$i] == "восьмерки" || $one[$i] == "восьмерок") {
    $kk1 = 8;
    $status = 5;
  } else if ($one[$i] == "девятки" || $one[$i] == "девяток") {
    $kk1 = 9;
    $status = 5;
  }
}

function k1() {
  if ($one[$i] == "ноль" || $one[$i] == "нуля") {
    $kk1 = 0;
    $status = 1;
  } else if ($one[$i] == "один" || $one[$i] == "одна") {
    $kk1 = 1;
    $status = 1;
  } else if ($one[$i] == "два" || $one[$i] == "две") {
    $kk1 = 2;
    $status = 1;
  } else if ($one[$i] == "три" || $one[$i] == "трое") {
    $kk1 = 3;
    $status = 1;
  } else if ($one[$i] == "четыре" || $one[$i] == "четверо") {
    $kk1 = 4;
    $status = 1;
  } else if ($one[$i] == "пять" || $one[$i] == "пятеро") {
    $kk1 = 5;
    $status = 1;
  } else if ($one[$i] == "шесть" || $one[$i] == "шестеро") {
    $kk1 = 6;
    $status = 1;
  } else if ($one[$i] == "семь" || $one[$i] == "семеро") {
    $kk1 = 7;
    $status = 1;
  } else if ($one[$i] == "восемь") {
    $kk1 = 8;
    $status = 1;
  } else if ($one[$i] == "девять") {
    $kk1 = 9;
    $status = 1;
  }
}

function k3() {
  if ($one[$i] == "одиннадцать") {
    $kk1 = 11;
    $status = 3;
  } else if ($one[$i] == "двенадцать") {
    $kk1 = 12;
    $status = 3;
  } else if ($one[$i] == "тринадцать") {
    $kk1 = 13;
    $status = 3;
  } else if ($one[$i] == "четырнадцать") {
    $kk1 = 14;
    $status = 3;
  } else if ($one[$i] == "пятнадцать") {
    $kk1 = 15;
    $status = 3;
  } else if ($one[$i] == "шестнадцать") {
    $kk1 = 16;
    $status = 3;
  } else if ($one[$i] == "семнадцать") {
    $kk1 = 17;
    $status = 3;
  } else if ($one[$i] == "восемнадцать") {
    $kk1 = 18;
    $status = 3;
  } else if ($one[$i] == "девятнадцать") {
    $kk1 = 19;
    $status = 3;
  }
}

function k2() {
  if ($one[$i] == "десять") {
    $kk1 = 10;
    $status = 2;
  } else if ($one[$i] == "двадцать") {
    $kk1 = 20;
    $status = 2;
  } else if ($one[$i] == "тридцать") {
    $kk1 = 30;
    $status = 2;
  } else if ($one[$i] == "сорок") {
    $kk1 = 40;
    $status = 2;
  } else if ($one[$i] == "пятьдесят") {
    $kk1 = 50;
    $status = 2;
  } else if ($one[$i] == "шестьдесят") {
    $kk1 = 60;
    $status = 2;
  } else if ($one[$i] == "семьдесят") {
    $kk1 = 70;
    $status = 2;
  } else if ($one[$i] == "восемьдесят") {
    $kk1 = 80;
    $status = 2;
  } else if ($one[$i] == "девяносто") {
    $kk1 = 90;
    $status = 2;
  }
}

$one = $queryText.split([" "]);
$all = "";
$time = $one.length;

for ($i = 0; $i < $time; $i++) {
  $status = 6;
  k1();
  k3();
  k2();
  k4();

  if ($status == 6) {
    $err = "Ошибка " + $status;
  } else {
    if ($status == 1) {
      $ss1 = $kk1;
      $i++;
      k5();
      if ($status == 5) {
        for ($sc = 0; $sc < $ss1; $sc++) {
          $all = $all + $kk1;
        }
      } else {
        $all = $all + $ss1;
        $i--;
      }
    } else if ($status == 3) {
      $all = $all + $kk1;
    } else if ($status == 4) {
      $status = 10;
      $pp1 = Number($kk1);
      $i++;
      k3();
      if ($status == 3) {
        $tt2 = Number($kk1);
        $pp1 = $pp1 + $tt2;
        $all = $all + $pp1;
      }
      k2();
      if ($status == 2) {
        $status = 10;
        $tt1 = Number($kk1);
        $i++;
        k1();
        if ($status == 1) {
          $tt2 = Number($kk1);
          $tt1 = $pp1 + $tt1 + $tt2;
          $all = $all + $tt1;
        }
        if ($status == 10) {
          $pp1 = $pp1 + $tt1;
          $all = $all + $pp1;
          $i--;
        }
      } else {
        k1();
        if ($status == 10) {
          $all = $all + $pp1;
          $i--;
        }
        if ($status == 1) {
          $tt2 = Number($kk1);
          $pp1 = $pp1 + $tt2;
          $all = $all + $pp1;
        }
      }
    } else if ($status == 2) {
      $status = 10;
      $pp1 = Number($kk1);
      $i++;
      k1();
      if ($status == 1) {
        $tt2 = Number($kk1);
        $pp1 = $pp1 + $tt2;
        $all = $all + $pp1;
      }
      if ($status == 10) {
        $all = $all + $pp1;
        $i--;
      }
    } else if ($status == 5) {
      $all = $all + $kk1;
    }
  }
}