condition字符串匹配问题

概述
freeswitch是一款简单好用的VOIP开源软交换平台。
fs使用dialplan配置文件执行业务流程,condition条件变量的配置是必然会使用的,这里记录一次配置过程中的错误示范。
环境
CentOS 7.9
freeswitch 1.10.7
问题描述
dialplan配置如下,本意是根据通道变量${poolType}的值,执行不同的app。
<context name="saxb_bind_axb">
<extension name="saxb_bind_axb" continue="true">
<condition field="${call_result}" expression="0" break="never">
<condition field="${poolType}" expression="APP" break="never">
<action application="saxb_bind_axb" />
<action application="transfer" data="${destination_number} XML saxb_bridge"/>
</condition>
<condition field="${poolType}" expression="SIP" break="never">
<action application="transfer" data="${destination_number} XML saxb_bridge"/>
</condition>
<condition field="${poolType}" expression="AX" break="never">
<action application="saxb_bind_ax" />
<action application="transfer" data="${destination_number} XML saxb_bridge"/>
</condition>
<condition field="${poolType}" expression="AXB" break="never">
<action application="saxb_bind_axb" />
<action application="transfer" data="${destination_number} XML saxb_bridge"/>
</condition>
<anti-action application="transfer" data="${destination_number} XML saxb_get_ax2"/>
</condition>
</extension>
</context>
问题现象
呼叫发起后的日志如下,其中通道变量${poolType}的值为AXB,但是在AX和AXB的分支都匹配成功并PASS了,业务流程执行了错误的分支。
2024-07-29 16:10:48.492821 [INFO] mod_dialplan_xml.c:637 Processing 10011 <10011>->13987654321 in context saxb_bind_axb
Dialplan: sofia/external/10011@10.55.55.138 parsing [saxb_bind_axb->saxb_bind_axb] continue=true
Dialplan: sofia/external/10011@10.55.55.138 Regex (PASS) [saxb_bind_axb] ${call_result}(0) =~ /0/ break=never
|--- Dialplan: Processing recursive conditions level:1 [saxb_bind_axb_recur_1] require-nested=TRUE
|--- Dialplan: sofia/external/10011@10.55.55.138 Regex (FAIL) [saxb_bind_axb_recur_1] ${poolType}(AXB) =~ /APP/ break=never
|--- Dialplan: sofia/external/10011@10.55.55.138 Regex (FAIL) [saxb_bind_axb_recur_1] ${poolType}(AXB) =~ /SIP/ break=never
|--- Dialplan: sofia/external/10011@10.55.55.138 Regex (PASS) [saxb_bind_axb_recur_1] ${poolType}(AXB) =~ /AX/ break=never
|--- Dialplan: sofia/external/10011@10.55.55.138 Action saxb_bind_ax()
|--- Dialplan: sofia/external/10011@10.55.55.138 Action transfer(${destination_number} XML saxb_bridge)
|--- Dialplan: sofia/external/10011@10.55.55.138 Regex (PASS) [saxb_bind_axb_recur_1] ${poolType}(AXB) =~ /AXB/ break=never
|--- Dialplan: sofia/external/10011@10.55.55.138 Action saxb_bind_axb()
|--- Dialplan: sofia/external/10011@10.55.55.138 Action transfer(${destination_number} XML saxb_bridge)
问题分析
<condition field="${poolType}" expression="AX" break="never">
默认的模式匹配不是精确匹配,所以也可以匹配通过。
解决方案
修改配置如下,修改"AX"字符串为"^AX$"。
<condition field="${poolType}" expression="^AX$" break="never">
测试结果如下。
|--- Dialplan: sofia/external/10011@10.55.55.138 Regex (FAIL) [saxb_bind_axb_recur_1] ${poolType}(AXB) =~ /^AX$/ break=never
condition匹配规则
在 FreeSWITCH 的拨号计划(dialplan)中,condition 是一个非常强大的特性,它允许你基于特定的条件来匹配和执行不同的命令。condition 可以匹配各种类型的字符串,包括但不限于用户输入、呼叫变量、环境变量等。
以下是一些常见的 condition 匹配规则。
精确匹配:
使用等号 == 进行精确匹配。如果左侧的表达式与右侧的字符串完全相同,则条件为真。
<condition field="destination_number" expression="^13712345678$">
正则表达式匹配:
使用 =~ 进行正则表达式匹配。FreeSWITCH 支持 Perl 兼容的正则表达式。
<condition field="destination_number" expression="^137[1-9]\d{7}$">
分组:
使用|匹配多个值。
<condition field="destination_number" expression="^13712345678|13799999999$">
多条件组合。
<conditionregex="all|any|xor">
<regexfield="some_field"expression="Some Value"/>
<regexfield="another_field"expression="^Another Value$"/>
<action(s)...>
<anti-action(s)...>
</condition>
asterisk模式。该模式没有xml模式灵活,应该是为了兼容老版本的过度模式。
<condition field="destination_number" expression="_13712345678">
总结
fs的dialplan配置很方便,但是也容易出错。
空空如常
求真得真
condition字符串匹配问题的更多相关文章
- 字符串匹配的KMP算法
~~~摘录 来源:阮一峰~~~ 字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串”BBC ABCDAB ABCDABCDABDE”,我想知道,里面是否包含另一个字符串”ABCDABD”? 许 ...
- {Reship}{KMP字符串匹配}
关于KMP字符串匹配的介绍和归纳,作者的思路非常清晰,推荐看一下 http://blog.csdn.net/v_july_v/article/details/7041827
- 字符串匹配(hash算法)
hash函数对大家来说不陌生吧 ? 而这次我们就用hash函数来实现字符串匹配. 首先我们会想一下二进制数. 对于任意一个二进制数,我们将它化为10进制的数的方法如下(以二进制数1101101为例): ...
- 【C++实现python字符串函数库】二:字符串匹配函数startswith与endswith
[C++实现python字符串函数库]字符串匹配函数startswith与endswith 这两个函数用于匹配字符串的开头或末尾,判断是否包含另一个字符串,它们返回bool值.startswith() ...
- sdut 2125串结构练习--字符串匹配【两种KMP算法】
串结构练习——字符串匹配 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目链接:http://acm.sdut.edu.cn/sduto ...
- C语言字符串匹配函数
C语言字符串匹配函数,保存有需要时可以用: #include <stdio.h> #include <stdlib.h> #include <string.h> # ...
- 字符串匹配--Karp-Rabin算法
主要特征 1.使用hash函数 2.预处理阶段时间复杂度O(m),常量空间 3.查找阶段时间复杂度O(mn) 4.期望运行时间:O(n+m) 本文地址:http://www.cnblogs.com/a ...
- 字符串匹配的KMP算法详解及C#实现
字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD" ...
- zstu.4194: 字符串匹配(kmp入门题&& 心得)
4194: 字符串匹配 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 206 Solved: 78 Description 给你两个字符串A,B,请 ...
- 字符串匹配与KMP算法实现
>>字符串匹配问题 字符串匹配问题即在匹配串中寻找模式串是否出现, 首先想到的是使用暴力破解,也就是Brute Force(BF或蛮力搜索) 算法,将匹配串和模式串左对齐,然后从左向右一个 ...
随机推荐
- 前端Uncaught (in promise) 的解决方法及原因
问题:在Vue项目中使用axios调用一个第三方的接口时,前端无法获取到接口返回值,检查控制台Network发现接口请求已经正常发出并且有数据返回,但是控制台Console报了这么一个错误 上图可以看 ...
- doris wget 地址
wget https://apache-doris-releases.oss-accelerate.aliyuncs.com/apache-doris-2.0.0-alpha1-bin-x86_64. ...
- 一份快速入门的 Makefile 教程
目录 一份快速入门的 Makefile 教程 关于 Makefile,你应该知道的一些事情 什么是 Makefile? Makefile 能做什么? Makefile 怎么写? Makefile 与 ...
- P1551 亲戚 题解。。。
并查集 目录 并查集 (1.概念: (2.详解 Q1:如何表示不同的家族 ans1: Q2:如何将两个人归到同一个家族中 ans2: CODE: PS: (1.概念: 处理 不相交 可合并 的集合关系 ...
- python重拾第十二天-sqlalchemy ORM
本节内容 ORM介绍 sqlalchemy安装 sqlalchemy基本使用 多外键关联 多对多关系 表结构设计作业 1. ORM介绍 orm英文全称object relational mapping ...
- Linux 内核:设备树(1)dtb格式
Linux 内核:设备树(1)dtb格式 背景 dtb作为二进制文件被加载到内存中,然后由内核读取并进行解析,如果对dtb文件的格式不了解,那么在看设备树解析相关的内核代码时将会寸步难行,而阅读源代码 ...
- KEIL5 编译生成 hex、bin文件
--- title: file_name date: 2020-05-31 10:27:10 categories: tags: - stm32 - keil - config --- KEIL 工程 ...
- 广播变量的使用-----通过ip查询属于哪个省份
1,为什么要使用广播变量? 举一个简单的例子,我们要处理一份log文件,里面有ip地址. 20090121000132095572000|125.213.100.123|show.51.com|/sh ...
- 创业型公司和BAT大厂招聘要求有什么不同?
背景 很多Java初学都关心这么一个问题,Java学到什么程度以后可以找到第一份工作.大家的目标都很明确,也很实在,学习Java无非就是为了找工作,那到底我要学多少Java知识,才可以找到第一份工作呢 ...
- 使用C#对华为IPC摄像头二次开发(二)
上一篇我们实现了用SDK登录摄像头并实现预览(https://www.cnblogs.com/wdw984/p/13564195.html),这次我们实现通过SDK调用摄像头本身自带的人脸抓拍功能. ...