Регулярное выражение для определения, является ли номер телефона «местный», «национальный», «мобильный», «премиум» и т. Д. - PullRequest
1 голос
/ 29 апреля 2011

Я запускаю простую форму PHP, чтобы показать использование телефонных звонков в нашей системе звездочек. Вся информация о вызовах записывается в базу данных.

Я знаком с регулярными выражениями и PHP (в некоторой степени), но никогда не пытался объединить их раньше.

При анализе данных я хочу определить тип исходящего вызова, чтобы мы могли выставлять счета нашему клиенту по правильному тарифу. Я разделяю исходящие звонки на несколько классов, например, «местный», «национальный», «мобильный», «премиум», «международный» и «внутренний», однако мои попытки сопоставить первый класс (т.е. 'local') не удалось.

Локальные вызовы всегда будут иметь префикс 9, за которым необязательно следует код локальной сети (01234 в этом примере). Затем следует локальный номер (567890 в этом примере). Обратите внимание, что местный номер не может начинаться с нуля.

Итак, числа, которые я пытаюсь сопоставить в приведенных выше примерах: 901234567890 или 9567890.

Обычно я использую регулярное выражение, такое как ^9(01234)?[1-9][0-9]+, и, проверяя его из оболочки bash, я получаю ожидаемые результаты

$ echo 091234567890 | egrep -e '^9(01234)?[1-9][0-9]+'
901234567890
$ echo 9567890 | egrep -e '^9(01234)?[1-9][0-9]+'
9567890
$ echo 908001234567 | egrep -e '^9(01234)?[1-9][0-9]+'
$ echo 901987654321 | egrep -e '^9(01234)?[1-9][0-9]+'
$ echo 907890123456 | egrep -e '^9(01234)?[1-9][0-9]+'

поэтому, пытаясь перевести это на работу в PHP, я придумал следующее:

$class='Unknown';
if (preg_match('/^9(01234)?[1-9][0-9]+/', $dest))
  $class='Local Call';
// More regex matches to follow for other classes

Теперь, когда я кидаю следующий список чисел в приведенном выше

901234567890
9567890
908001234567
901987654321
907890123456

каждое из чисел соответствует регулярному выражению. Что я делаю не так?

Ответы [ 4 ]

3 голосов
/ 29 апреля 2011

Работает, как и ожидалось для меня. $dest настроен правильно?


Мой тест

$nums = array(
    901234567890,
    9567890,
    908001234567,
    901987654321,
    907890123456,
);

foreach ($nums as $num) {
    if (preg_match('/^9(01234)?[1-9][0-9]+/', $num)) {
        echo "$num matches\n";
    }
}

Результаты

901234567890 matches
9567890 matches
2 голосов
/ 29 апреля 2011

Вы бросаете все числа в коде как единственную строку ?Потому что это совсем не то же самое, что отправлять их по одному.Если одна из строк соответствует регулярному выражению, весь тест завершается успешно.Другими словами, это эквивалентно этому:

echo '901234567890
9567890
908001234567
901987654321
907890123456' | egrep -e '^9(01234)?[1-9][0-9]+'

Использовать метод Мудрого .

1 голос
/ 29 апреля 2011
$n[] = 901234567890;
$n[] = 9567890;
$n[] = 908001234567;
$n[] = 901987654321;
$n[] = 907890123456;
$n[] = 901;

foreach( $n as $t){

if (preg_match('/^9(01234)?[1-9][0-9]+/', $t))
  echo 'Local Call' . PHP_EOL ;

}

Что дает мне два местных звонка?

1 голос
/ 29 апреля 2011

Я запустил тест на всех ваших числах, и он сработал:

$nums = array('901234567890', '9567890'
   , '908001234567', '901987654321', '907890123456');
foreach ($nums as $num) {
   if (preg_match('/^9(01234)?[1-9][0-9]+/', $num)) {
      echo "$num passes\n";
   }
   else {
      echo "$num fails\n";
   }
}

901234567890 passes
9567890 passes
908001234567 fails
901987654321 fails
907890123456 fails

В вашем коде все, что делает передача, - это переменная, поэтому, возможно, вам нужно проверить, чтоэто устанавливается ..

В дополнение к этому, я скажу, что проверка телефонных номеров по регулярному выражению - обреченное усилие.Это немного далеко, но это очень сложно.У меня на работе разбирается номер для разбора телефонных номеров длиной более 1400 строк, и он до сих пор работает не во всех случаях.

...