我有一个旧版本的freePBX(超过5000个扩展,数百个ivr),我必须为迁移到新版本编写文档。我必须映射哪些ivr使用哪些中继。要做到这一点,我必须将所拨打的号码与出站路由的拨号模式相匹配。
我必须匹配的模式表的'extensions'列看起来像
19328555
_13XXXX
_1933370[0-2]
_2805XX
_28[3-7]XXX
_331XXX
_848XXX
_85XXXXX
_879XXX
例如,我必须找到哪个'扩展'模式与数字8481234匹配,然后我可以从另一列中获取主干。
我知道必须有一个函数嵌入在星号的工作方式,如
$number='8481234';
$pattern='_879XXX';
if (asterisk_pattern_match($number,$pattern)) {
#get trunk column from that row
}
可以是SQL、Perl或PHP。我可以写,但我肯定我是在重新发明轮子。有人知道这样的函数吗可能吗?我已经用谷歌搜索了我能想到的所有方法,但所有的结果都是关于在星号拨号计划中使用MySQL,这对我来说没有价值。
谢谢!
谢谢大家。我在
找到了我要找的程序。https://gist.github.com/lgaetz/8695182名为match_pattern.php,由Lorne Gaetz修改并发布在git上。
描述:两个PHP函数,match_pattern和match_pattern_all将一个数字字符串与一个Asterisk拨号模式(或模式数组)进行比较,并返回一个修改后的数字字符串。
您可以使用以下脚本来查找匹配,结合您在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";
}