На самом деле, тут - http://voip.rus.net/tiki-index.php?page=Asterisk+Dialplan+Patterns :-)
litnimax (Jul 16 '12)editУмеет ли Asterisk парсить регулярные выражения в экстенах диалплана, т.е. сработает ли следующее:
exten => _8924[5-6]{1}44XXXX
где почитать про возможные выражения, а то всё сводится к X да N.
итак.
exten => _8924[5-6]{1}44XXXX
равносильно одному!!! правилу
exten => _8924[5-6]44XXXX,1,Noop
а в чем у вас проблема то?
Астериск не умеет работать с регэкспами в качестве шаблона номера, это слишком ресурсоемко. Прочитать можно тут
http://voip.rus.net/tiki-index.php?page=Asterisk%20config%20extensions.conf
На самом деле, тут - http://voip.rus.net/tiki-index.php?page=Asterisk+Dialplan+Patterns :-)
litnimax (Jul 16 '12)editСделайте через regexp и goto, выставляя флаг а уже потом на основе этих флагов роутинг делайте.
http://www.voip-info.org/wiki/view/Asterisk+func+regex
или вообще все в (Fast)AGI вытащить.
Вот еще решение, с использованием Lua, на котором написан макрос, реализующий поиск по regexp'ам, но не перловым (PCRE), а Lua'вским (LPEG).
Вот диалплан:
exten => _X.,1,Macro(regexp,^%d%d%d$)
exten => _X.,2,Verbose(We passwd regexp, let's do smth)
Можно каскадировать макросы друг за другом.
Вот кусок из extensions.lua:
-- Verbose levels
DEBUG = 10
VERBOSE = 3
extensions = {}
extensions['macro-regexp'] = {}
extensions['macro-regexp']['s'] = function()
local pattern = channel.arg1:get()
local called = channel["CALLERID(dnid)"]:get()
if not called:match(pattern) then
app.verbose(DEBUG, string.format("False, number %q does not match pattern %q, hanging up", called, pattern))
app.hangup()
else
app.verbose(DEBUG, string.format("True, number %q matches pattern %q, hanging up", called, pattern))
end
end
Ну и логи:
== Using SIP RTP CoS mark 5
-- Executing [111@users:1] Macro("SIP/101-00000042", "regexp,^%d%d%d$") in new stack
-- Executing [s@macro-regexp:1] verbose("SIP/101-00000042", "10,True, number "111" matches pattern "^%d%d%d$", hanging up")
> True, number "111" matches pattern "^%d%d%d$", hanging up
-- Executing [111@users:2] Verbose("SIP/101-00000042", "We passed regexp, let's do smth") in new stack
[Jul 16 22:49:41] WARNING[5845]: app_verbose.c:101 verbose_exec: 'We passed regexp' is not a verboser number
let's do smth
-- Auto fallthrough, channel 'SIP/101-00000042' status is 'UNKNOWN'
== Using SIP RTP CoS mark 5
-- Executing [1111@users:1] Macro("SIP/101-00000043", "regexp,^%d%d%d$") in new stack
-- Executing [s@macro-regexp:1] verbose("SIP/101-00000043", "10,False, number "1111" does not match pattern "^%d%d%d$", hanging up")
> False, number "1111" does not match pattern "^%d%d%d$", hanging up
-- Executing [s@macro-regexp:1] hangup("SIP/101-00000043", "")
== Spawn extension (macro-regexp, s, 1) exited non-zero on 'SIP/101-00000043' in macro 'regexp'
== Spawn extension (users, 1111, 1) exited non-zero on 'SIP/101-00000043'
*CLI>
:-)
Ну IMHO более правильно использовать функцию REGEX :-)
===== UPD =====
умеет, просто тут попроще чем в обычных регулярках
X - 0-9
Z - 1-9
N - 2-9
Чтобы указать диапазон чисел, заключаем их в квадратные скобки и перечисляем без запятой, для идущих подряд можно использовать дефис.
[35-79] == 3,5,6,7,9
Указывать можно по одной цифре, т.е. [3-8]{2} не верно, правильно [3-8][3-8]
Вот пример:
exten => _89[0-26][2-49]XXXXXXX
[s]Значит не умеет, придётся городить портянку на несколько страниц :([/s]
Задан: Jul 16 '12
Просмотрен: 5,071 раз
Обновлен: Jul 17 '12
Проект компании "АТС Дизайн"
Asterisk® и Digium® являются зарегистрированными торговыми марками компании
Digium, Inc., США.
IP АТС Asterisk распространяется под лицензией
GNU GPL.