Заменить символы в диалплане Asterisk - PullRequest
2 голосов
/ 18 декабря 2009

Я хочу изменить пару символов * # для A и P, чтобы сделать имя файла монитора более удобным. Единственное решение, которое я смог найти, - это сделать это самостоятельно в пределах диалплана, но оно генерирует много подробностей и не так эффективно (быстро), как хотелось бы. Я опубликую это здесь на тот случай, если кто-то захочет его использовать. Но я ищу функцию звездочки, чтобы я мог скомпилировать что-нибудь, что я могу вызвать с помощью схемы набора, например $ {REPLACE ($ {EXTEN}, *, a)} и преобразовать расширение ** 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})

Ответы [ 3 ]

2 голосов
/ 03 января 2013

Функция 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' 
1 голос
/ 21 января 2010

Другая альтернатива тому, что вы сделали, - это использование AGI-скрипта. Просто напишите свой код в bash / python / etc и используйте его как AGI (replace, $ {arg1}, $ {arg2}, $ {arg3}). Может быть не так быстро, как внутренняя функция, но она более компактна и потенциально быстрее, чем ваше решение.

1 голос
/ 18 декабря 2009

Это действительно лучший способ сделать это (без использования регулярных выражений). Если вы хотите использовать регулярные выражения (regex), Asterisk 1.1+ полностью поддерживает его. Это позволит вам сделать весь ваш макрос в одну строку. Документация по использованию регулярных выражений в диалплане находится здесь: voip-info .

Надеюсь, это поможет! На этой странице voip-info есть множество примеров, которые могут вам помочь!

...