Asterisk 替换星号拨号计划中的字符

Asterisk 替换星号拨号计划中的字符,asterisk,replace,telephony,Asterisk,Replace,Telephony,我想更改a和p的两个字符*#,以使监视器文件名中的字符更友好。我能找到的唯一解决方案是在dialplan中自己完成,但它会生成大量冗长的输出,并且没有我希望的那么高效(快速)。我会把它贴在这里,以防有人想用。但是我正在寻找一个星号函数,我可以编译一些我可以用拨号计划调用的东西,比如${REPLACE(${EXTEN},*,a)},并将EXTEN**123**456***转换为AA123AA456AAA ; ; MACRO REPLACE ; [macro-replace] ; ; ${ARG

我想更改a和p的两个字符*#,以使监视器文件名中的字符更友好。我能找到的唯一解决方案是在dialplan中自己完成,但它会生成大量冗长的输出,并且没有我希望的那么高效(快速)。我会把它贴在这里,以防有人想用。但是我正在寻找一个星号函数,我可以编译一些我可以用拨号计划调用的东西,比如${REPLACE(${EXTEN},*,a)},并将EXTEN**123**456***转换为AA123AA456AAA

;
; MACRO REPLACE
;
[macro-replace]
;
;   ${ARG1} - String source
;   ${ARG2} - Chars to replace
;   ${ARG3} - Chars to replace with
;
exten => s,1,NoOp(Replacing ${ARG2} for ${ARG3} in ${ARG1})
exten => s,n,Set(str=${ARG1})
exten => s,n,Set(find=${ARG2})
exten => s,n,Set(replace=${ARG3})
exten => s,n,Set(i=0)
exten => s,n,Set(length=${LEN(${str})})
exten => s,n,While($[${i} < ${length}])
exten => s,n,GotoIf($["${str:${i}:1}" != "${find}"]?continue)
exten => s,n,Set(pre=)
exten => s,n,GotoIf($["${i}" = "0"]?post)
exten => s,n,Set(pre=${str:0:${i}})
exten => s,n(post),Set(post=)
exten => s,n,GotoIf($["${i}" = $[${length} - 1]]?write)
exten => s,n,Set(post=${str:$[${i} + 1]})
exten => s,n(write),Set(str=${pre}${replace}${post})
exten => s,n(continue),Set(i=$[${i} + 1])
exten => s,n,EndWhile
exten => s,n,Set(REPLACERESULT=${str})

这确实是最好的方法(不使用正则表达式)。如果您想使用正则表达式,Asterisk 1.1+完全支持它。这将允许您在一行中执行整个宏。在dialplan中使用正则表达式的文档如下:


希望这有帮助!在voip信息页面上有很多例子可以帮助您

另一种替代方法是使用AGI脚本。只需在bash/python/etc中编写代码,并将其用作AGI(替换,${arg1},${arg2},${arg3})。可能不如内部函数快,但它比您的解决方案更紧凑,可能更快。

现在,REPLACE()函数很容易做到这一点:

exten => 100,1,Set(find=**123**456***)
same => n,NoOp(find=${find})
same => n,Set(replace=${REPLACE(find,*,A)})
same => n,NoOp(find=${find}, replace=${replace})
same => n,hangup()
输出:

*CLI> channel originate local/100@default extension null@default
    -- Executing [100@default:1] Set("Local/100@default-c758;2", "find=**123**456***") in new stack
    -- Executing [100@default:2] NoOp("Local/100@default-c758;2", "find=**123**456***") in new stack
    -- Executing [100@default:3] Set("Local/100@default-c758;2", "replace=AA123AA456AAA") in new stack
    -- Executing [100@default:4] NoOp("Local/100@default-c758;2", "find=**123**456***, replace=AA123AA456AAA") in new stack
    -- Executing [100@default:5] Hangup("Local/100@default-c758;2", "") in new stack
  == Spawn extension (default, 100, 5) exited non-zero on 'Local/100@default-c758;2' 

我为你不得不打这些感到抱歉。在Python中,它只是“123***ABC####”。replace('*',A')。replace('#',P)lol。我写它感觉糟透了。但最好是我第一次尝试调用系统(使用sed替换为regex |使用asterisk-rx“database put REPLACERESULT”管道输出),每次调用将花费1秒钟来执行该行。如果我错了,请纠正我,但当我读到这篇文章时,asterisk中的regex实现似乎可以帮助您找到匹配项,非常适合GotoIf。但是如何使用正则表达式替换?如何替换逗号?这不会解析:
${REPLACE(find,,,A)}
您可以使用escape:so,will\,