数据库
首页 > 数据库> > PHP-MySQL或Perl函数以匹配星号Dialplan模式

PHP-MySQL或Perl函数以匹配星号Dialplan模式

作者:互联网

我有一个旧版本的freePBX(超过5000个扩展名,数百个IVR),我必须记录该文件才能迁移到较新的版本.我必须映射哪些IVR使用哪个中继.为此,我必须将要拨打的号码与出站路由的拨号方式进行匹配.

表格的“扩展”列包含我必须匹配的模式,如下所示

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

例如,我必须找到与数字8481234匹配的“扩展名”模式,然后才能从另一列中提取主干.

我知道必须在Asterisk中嵌入一个功能类似于

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

它可以是SQL,Perl或PHP.我可以写,但是我敢肯定我会重新发明轮子.有没有人知道这样的功能在哪里
也许?我已经尽一切可能用Google搜索,但是所有结果都是关于在星号拨号计划中使用MySQL,这对我没有任何意义.

谢谢!

解决方法:

您可以使用以下脚本来查找匹配项,以及在Asterisk CLI上运行的Dialplan show extension @ context的结果的结合,这将向您显示匹配项的执行顺序.

#!/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";
}

标签:mysql,php,perl,asterisk
来源: https://codeday.me/bug/20191028/1949113.html