2

A と P のいくつかの文字 * # を変更して、モニターのファイル名をより使いやすい文字に変更したいと考えています。私が見つけた唯一の解決策は、ダイヤルプラン内で自分で行うことでしたが、それは多くの詳細な出力を生成し、私が望むほど効率的 (高速) ではありません。誰かがそれを使用したい場合に備えて、ここに投稿します。しかし、${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})

4

3 に答える 3

2

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' 
于 2013-01-03T14:49:45.530 に答える
1

あなたが行ったことに代わる別の方法は、AGI スクリプトを使用することです。コードを bash/python/etc に記述して、AGI(replace,${arg1},${arg2},${arg3}) として使用するだけです。内部関数ほど高速ではないかもしれませんが、ソリューションよりもコンパクトで潜在的に高速です。

于 2010-01-21T06:53:32.277 に答える
1

これが本当に最善の方法です (正規表現を使用せずに)。regex (正規表現) を使用したい場合、Asterisk 1.1+ はそれを完全にサポートしています。これにより、マクロ全体を 1 行で実行できます。ダイヤルプランで正規表現を使用するためのドキュメントは次のとおりです: voip-info

うまくいけば、これが役に立ちます!その voip-info ページには、役立つはずの例がたくさんあります!

于 2009-12-17T22:24:31.400 に答える