2 votes

Remplacer les caractères dans le plan de numérotation Asterisk

Je veux changer quelques caractères * # pour A et P pour avoir le nom de fichier du moniteur avec des caractères plus conviviaux. La seule solution que j'ai trouvée est de le faire moi-même dans le plan d'appel mais cela génère beaucoup de verbiage et n'est pas aussi efficace (rapide) que je le voudrais. Je vais la poster ici au cas où quelqu'un voudrait l'utiliser. Mais je cherche une fonction asterisk que je puisse compiler et que je puisse appeler dans le dialplan comme ${REPLACE(${EXTEN},*,a)} pour que l'exten **123**456*** soit converti en 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})

2voto

NTUI Points 84

La fonction REPLACE() permet désormais de le faire facilement :

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()

Sortie :

*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'

1voto

rdegges Points 3008

C'est vraiment le meilleur moyen de le faire (sans utiliser de regex). Si vous souhaitez utiliser les expressions régulières, Asterisk 1.1+ les prend entièrement en charge. Cela vous permettra de réaliser l'intégralité de votre macro en une seule ligne. La documentation sur l'utilisation de regex dans dialplan se trouve ici : voip-info .

J'espère que cela vous aidera ! Il y a beaucoup d'exemples sur la page voip-info qui devraient pouvoir vous aider !

1voto

Farid Fadaie Points 31

Une autre alternative à ce que vous avez fait est d'utiliser un AGI script. Il suffit d'écrire votre code en bash/python/etc et de l'utiliser comme AGI(replace,${arg1},${arg2},${arg3}). Ce n'est peut-être pas aussi rapide qu'une fonction interne mais c'est plus compact et potentiellement plus rapide que votre solution.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X