Функция MySQL или Perl для соответствия шаблону плана набора звездочек

У меня есть старая версия freePBX (более 5000 расширений, сотни IVR), которую я должен документировать для перехода на более новую версию. Я должен отобразить, какие IVR используют какие транки. Для этого я должен сопоставить набираемый номер с шаблоном набора исходящего маршрута.

Столбец «расширений» таблицы с шаблонами, которые я должен сопоставить, выглядит следующим образом

19328555
_13XXXX
_1933370[0-2]
_2805XX
_28[3-7]XXX
_331XXX
_848XXX
_85XXXXX
_879XXX

Например, я должен найти, какой шаблон ‘extensions’ соответствует номеру 8481234, тогда я могу получить транк из другого столбца.

Я знаю, что должна быть функция, встроенная в Asterisk, которая работает как

$number='8481234';
$pattern='_879XXX';
if (asterisk_pattern_match($number,$pattern)) {
#get trunk column from that row
}

Это может быть SQL, Perl или PHP. Я мог бы написать это, но я уверен, что буду изобретать велосипед. Кто-нибудь имеет или знает, где такая функция
может быть? Я погуглил все возможные способы, но все результаты касаются использования MySQL в абонентской группе звездочки, и это не имеет для меня никакого значения.

Спасибо!

3

Решение

Вы можете использовать следующий скрипт для поиска совпадений в сочетании с результатами из dialplan show extension@context который вы запускаете на Asterisk CLI, это покажет вам порядок выполнения матчей.

#!/usr/bin/env perl
use strict;
use warnings;

my $numbers = [
"8481234", "8581234", "1283123"];

my $patterns = [
"19328555" , "_13XXXX"     , "_1933370[0-2]" ,
"_2805XX"  , "_28[3-7]XXX" , "_331XXX"       ,
"_848XXX"  , "_85XXXXX"    , "_879XXX"       ,
];

# Lets turn partterns into usable regex, based on the reference:
#   https://wiki.asterisk.org/wiki/display/AST/Pattern+Matching

foreach my $r (@$patterns)
{
$r =~ s/_/^/;        # Proper regex starts with
$r =~ s/X|x/\\d/g;     # Replace X with any digit
$r =~ s/Z|z/[1-9]/g;  # Replace Z with 1-9 as per spec
$r =~ s/N|m/[2-9]/g;  # Replace N with 2-9 as per spec

my @matches = grep(/$r/i, @$numbers);

print "Matching numbers for: ", $r, " are: ", join(', ', @matches), "\n";
}
2

Другие решения

Спасибо всем. Я нашел точную программу, которую искал на

https://gist.github.com/lgaetz/8695182

Она называется match_pattern.php, изменена и размещена на git Лорном Гетцем.

Описание: две функции PHP, match_pattern и match_pattern_all, которые сравнивают числовую строку с шаблоном набора звездочек (или массивом шаблонов) и возвращают измененную числовую строку.

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector