First time here? Check out the FAQ!

Пожалуйста, войдите здесь. Часто задаваемые вопросы О нас
Задайте Ваш вопрос

extensions.conf: exten => regexp

2

Умеет ли Asterisk парсить регулярные выражения в экстенах диалплана, т.е. сработает ли следующее:

exten => _8924[5-6]{1}44XXXX

где почитать про возможные выражения, а то всё сводится к X да N.

спросил Jul 16 '12

thunderamur Gravatar thunderamur
444 70 12 39

обновил Jul 16 '12

alexcr Gravatar alexcr
3124 10 9 51
http://asterisk-service.c...

6 Ответов

1

итак.

exten => _8924[5-6]{1}44XXXX

равносильно одному!!! правилу

exten => _8924[5-6]44XXXX,1,Noop

а в чем у вас проблема то?

ссылка удалить спам редактировать

ответил Jul 16 '12

meral Gravatar meral flag of Ukraine
23347 24 20 177
http://pro-sip.net/
2

Астериск не умеет работать с регэкспами в качестве шаблона номера, это слишком ресурсоемко. Прочитать можно тут

http://voip.rus.net/tiki-index.php?page=Asterisk%20config%20extensions.conf

ссылка удалить спам редактировать

ответил Jul 16 '12

switch Gravatar switch
8334 11 7 92
http://lynks.ru/

Comments

1

На самом деле, тут - http://voip.rus.net/tiki-index.php?page=Asterisk+Dialplan+Patterns :-)

litnimax (Jul 16 '12)edit

ну вообщето вроде гдето был експеременатльный модуль который полные регекспы умеет. только он кажися на лиспе был.

meral (Jul 16 '12)edit
2

Сделайте через regexp и goto, выставляя флаг а уже потом на основе этих флагов роутинг делайте.

http://www.voip-info.org/wiki/view/Asterisk+func+regex

или вообще все в (Fast)AGI вытащить.

ссылка удалить спам редактировать

ответил Jul 16 '12

komrad123 Gravatar komrad123
3810 5 3 44

Comments

В FastAGI это уж излишество просто так вот брать и писать :-) Прям вся архитектура меняется :-)

litnimax (Jul 16 '12)edit
0

Вот еще решение, с использованием 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 :-)

ссылка удалить спам редактировать

ответил Jul 16 '12

litnimax Gravatar litnimax
1453 11 8 29
http://www.pbxware.ru/
0

===== 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
ссылка удалить спам редактировать

ответил Jul 17 '12

thunderamur Gravatar thunderamur
444 70 12 39
0

[s]Значит не умеет, придётся городить портянку на несколько страниц :([/s]

ссылка удалить спам редактировать

ответил Jul 16 '12

thunderamur Gravatar thunderamur
444 70 12 39

обновил Jul 17 '12

Comments

Очень интересная задачка..

litnimax (Jul 16 '12)edit

зачем? что вам мешает описать все правила как астериск хочет?

meral (Jul 16 '12)edit

Ваш ответ

Please start posting your answer anonymously - your answer will be saved within the current session and published after you log in or create a new account. Please try to give a substantial answer, for discussions, please use comments and please do remember to vote (after you log in)!
[скрыть предварительный просмотр]

Закладки и информация

Добавить закладку

подписаться на rss ленту новостей

Статистика

Задан: Jul 16 '12

Просмотрен: 5,071 раз

Обновлен: Jul 17 '12

Проект компании "АТС Дизайн"
Asterisk® и Digium® являются зарегистрированными торговыми марками компании Digium, Inc., США.
IP АТС Asterisk распространяется под лицензией GNU GPL.