首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >替换星号拨号方案中的字符

替换星号拨号方案中的字符
EN

Stack Overflow用户
提问于 2009-12-18 06:15:45
回答 3查看 15.1K关注 0票数 2

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

代码语言:javascript
复制
;
; 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})

EN

回答 3

Stack Overflow用户

发布于 2013-01-03 22:49:46

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

代码语言:javascript
复制
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()

输出:

代码语言:javascript
复制
*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' 
票数 2
EN

Stack Overflow用户

发布于 2009-12-18 06:24:31

这确实是最好的方法(不使用正则表达式)。如果你想使用正则表达式( regex ),Asterisk 1.1+完全支持它。这将允许您在一行中完成整个宏。在拨号方案中使用正则表达式的文档在这里:voip-info

希望这能有所帮助!在voip-info页面上有很多例子应该能够帮助你!

票数 1
EN

Stack Overflow用户

发布于 2010-01-21 14:53:32

您所做的另一种选择是使用AGI脚本。只需在bash/python/etc中编写代码并将其用作AGI(replace,${arg1},${arg2},${arg3})。它可能没有内部函数快,但它更紧凑,而且可能比你的解决方案更快。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1924982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档