如何使用Asterisk的CUT()函数处理双字符分隔符@;?
解决Asterisk拨号计划中双字符分隔符的变量拆分问题
Asterisk的CUT()和FIELDQTY()函数仅支持单字符分隔符,无法直接处理@;这类双字符分隔符。解决思路是先通过REPLACE()将双字符分隔符替换为一个唯一的单字符(需确保该字符不会出现在原变量的键值内容中,比如|),再用常规函数处理。
修改后的完整拨号计划代码如下:
exten => addheader,1,NoOp(CTI_VARIABLES: ${CTI_VARIABLES}) same => n,GotoIf($["${CTI_VARIABLES}" = ""]?noVariables) ; 将双字符分隔符@;替换为单字符|,生成临时变量 same => n,Set(CTI_VARS_TMP=${REPLACE(CTI_VARIABLES,@\;,|)}) ; 统计替换后的子变量数量 same => n,Set(TOTAL_VARS=${FIELDQTY(CTI_VARS_TMP,|)}) same => n,Set(COUNTER=1) same => n,While($[${COUNTER} <= ${TOTAL_VARS}]) ; 基于单字符|拆分临时变量 same => n,Set(CURRENT_VAR=${CUT(CTI_VARS_TMP,|,${COUNTER})}) same => n,Set(VAR_NAME=${CUT(CURRENT_VAR,\=,1)}) same => n,Set(VAR_VALUE=${CUT(CURRENT_VAR,\=,2)}) same => n,Set(PJSIP_HEADER(add,${VAR_NAME})=${VAR_VALUE}) same => n,NoOp(${VAR_NAME}: ${VAR_VALUE}) same => n,Set(COUNTER=$[${COUNTER}+1]) same => n,EndWhile same => n(noVariables),NoOp(No CTI Variables Set)
关键步骤说明
- 替换分隔符:使用
REPLACE(CTI_VARIABLES,@\;,|)把所有@;替换为|,将原字符串转换为单字符分隔的格式。这里\;是对分号的转义,避免被Asterisk解析为命令分隔符。 - 统计变量数量:
FIELDQTY(CTI_VARS_TMP,|)基于新的单字符分隔符统计子变量总数,确保循环次数正确。 - 拆分与处理:后续的
CUT()操作基于替换后的临时变量执行,逻辑与原代码一致,顺利拆分每个键值对并添加为PJSIP头部。
内容的提问来源于stack exchange,提问作者Mustafa
相关产品推荐
相关产品推荐

