Asterisk function 'CUT'
CUT(varname,char-delim,range-spec)
Функция Asterisk: разрезать строку по заданными разделителям.
Описание
- varname - переменная, которую надо обрезать
- char-delim - по умолчанию '-'
- range-spec - Обрабатывает строку в переменной в соответствии с указанным разделителем (по умолчанию: '-') и возвращает запрошенные поля. Поле также может быть диапазоном полей (например, '2-4') или несколькими полями и диапазонами, разделенными «&», например. '2-4&6'; диапазоны, такие как 3- (все начиная от поля 3 включено) или '-3' (все до поля '3').
- «CUT(somevar,,3-)» получим 3-е поле и все после него,
- «CUT(somevar,,-2)» получим 2-ое поле и все до него.
Разделитель должен быть одним символом. Если указаны несколько символов, используется только первый символ.
Чтобы указать запятую или точку с запятой в качестве разделителя, экранируйте ее с помощью обратного слэша: CUT(foo,\,,1)
Если указано несколько полей, то они объединяются вместе, через заданный разделитель:
exten => s,1,Set(foo=1-2-3-4-5) exten => s,2,Set(foo=${CUT(foo,,1-3&5)}) ;вернет 1-2-3-5 ;char-delim - по умолчанию '-', поэтому разделитель в данном примере не указан
CUT часто используется для обрезки уникальной секции названия канала.
Например, имя канала может быть SIP/somehost-f387, и вы можете обрезать его получив - SIP/somehost.
Синтаксис
CUT(varname,[delimiter],range-spec)
Пример
Предположим, имеется таблица БД - devices, с данными SIP устройств.
+------+-------+------------+------------+------+-------------+---------------+ | id | tech | dial | devicetype | user | description | emergency_cid | +------+-------+------------+------------+------+-------------+---------------+ | 4889 | pjsip | PJSIP/4889 | fixed | 4889 | sip 4889 | | | 4887 | sip | SIP/4887 | fixed | 4887 | sip 4887 | | | 4886 | sip | SIP/4886 | fixed | 4886 | sip 4886 | | +------+-------+------------+------------+------+-------------+---------------+
exten => _4XXX,1,verbose(${REALTIME(devices,user,${EXTEN},:,:)})
Функция REALTIME() возвращает на строку содержащую user:4889 c двоеточием в качестве разделителя:
Verbose("id:4889:tech:pjsip:dial:PJSIP/4889:devicetype:fixed:user:4889:description:sip 4889:")
Требуется получить технологию из поля под порядковым номером 6, в данном случае PJSIP/4889.
используем для этого функцию CUT():
exten => _4XXX,1,verbose(${CUT(REALTIME(devices,user,${EXTEN},:,:),:,6)})
и получим требуемое значение:
Verbose("PJSIP/4889")
Поля 4,5 и 6:
exten => _4XXX,1,verbose(${CUT(REALTIME(devices,user,${EXTEN},:,:),:,4-6)})
Verbose("pjsip:dial:PJSIP/4889")
Поля 6 и 8:
exten => _4XXX,1,verbose(${CUT(REALTIME(devices,user,${EXTEN},:,:),:,6&8)})
Verbose("PJSIP/4889:fixed")