Страниц: [1]   Вниз
  Отправить эту тему    Печать  
Автор Тема: Регулярные выражения в правилах списков не справляются с «слишком длинными» url?  (Прочитано 4528 раз)
0 Пользователей и 1 Гость смотрят эту тему.
LeD
Новичок
*

Репутация: +0/-0
Offline Offline

Сообщений: 7


« : 20 августа 2012, 15:37:14 »

Столкнулся с тем, что часть файлов/запросов «проскакивают» мимо правила.

Выясняя, какие именно, обнаружил, что от остальных они отличаются большой длиной url.

Пример:
Код:
http://l-stat.livejournal.com/js/??jquery/jquery.lj.inlineCalendar.js,jquery/jquery.lj.calendar.js,jquery/jquery.mask.js,share.js,controlstrip.js,jquery/jquery.calendarEvents.js,jquery/jquery.lj.modal.js,jquery/jquery.lj.repostbutton.js,s2.js,jquery/jquery.lj.confirmbubble.js,fb-select-image.js,lj.postmessage.js,quickreply.js,thread_expander.js,thread_expander.ex.js,commentmanage.js,ie9pinned.js,jquery/jquery.vkloader.js,lj.api.js?v=1345142931
Ещё пример:
Код:
http://l-stat.livejournal.com/js/??inputcomplete.js,jquery/jquery.ui.position.min.js,jquery/jquery.ui.autocomplete.min.js,jquery/jquery.bgiframe.js,gears_init.js,scanner.js,photobucket_jw.js,widget_ippu/selecttags.js,entry.js,poll.js,horizon.js,ie9pinned.js,jquery/jquery.vkloader.js,lj.api.js?v=1345142931

Поместив их в «Тренажёр» и применяя правило, получаю:
Код:
Mark: 
RegEx error - PCRE_ERROR_MATCHLIMIT

Похоже, дело в слишком большой длине url.
Каковы именно ограничения у регэкспов правил? Можно ли с этим что-то сделать?

Если это важно, правило это — моё, из списка «Преобразование URL».
Код:
True#~#((.+)\.)*([-a-z0-9]+)\.([a-z]+)/#~#\4/\3.\4/\1\3.\4/#~#True#~#True#~#
Я им файлы в кэше по доменам/поддоменам раскладываю. То есть, к примеру, файлы из i165.photobucket.com/итд лежат в кэше по com/photobucket.com/i165.photobucket.com/итд.
Сообщить модератору   Записан

HandyCache 1.0.0.377
mai62
Автор HC
*****

Репутация: +226/-4
Offline Offline

Сообщений: 6383


« Ответ #1 : 21 августа 2012, 00:02:07 »

Появление ошибки PCRE_ERROR_MATCHLIMIT зависит от пары строка+рег.выражение. Например, если убрать последний символ / у Вашего выражения, то ошибка PCRE_ERROR_MATCHLIMIT перестает появляться. Вам нужно попробовать составить более эффективное выражение.
Сообщить модератору   Записан
Михаил
Gold beta tester
*****

Репутация: +337/-14
Offline Offline

Сообщений: 5513



« Ответ #2 : 21 августа 2012, 00:02:59 »

Что если в правиле заменить "*" на "?"
Сообщить модератору   Записан
LeD
Новичок
*

Репутация: +0/-0
Offline Offline

Сообщений: 7


« Ответ #3 : 21 августа 2012, 00:26:31 »

Появление ошибки PCRE_ERROR_MATCHLIMIT зависит от пары строка+рег.выражение.
Это понятно. Полезно было бы знать, с чем связано ограничение.

Например, если убрать последний символ / у Вашего выражения, то ошибка PCRE_ERROR_MATCHLIMIT перестает появляться. Вам нужно попробовать составить более эффективное выражение.
Хм. Не догадался бы. Действительно перестаёт. Правда и работает после этого не так, как нужно, но это уже другой вопрос.

Что если в правиле заменить "*" на "?"
О! Сэнкс, то что надо. И в самом деле, там же вхождение не более раза. А ошибка ушла.
Сообщить модератору   Записан

HandyCache 1.0.0.377
mai62
Автор HC
*****

Репутация: +226/-4
Offline Offline

Сообщений: 6383


« Ответ #4 : 21 августа 2012, 00:55:11 »

Цитировать
Это понятно. Полезно было бы знать, с чем связано ограничение.
C ограничением доступной памяти. Движок, выполняющий регулярные выражения, размещает свои данные в стэке (так намного быстрее, чем в куче), а размер стэка ограничен и не поддается виртуализации.
Сообщить модератору   Записан
Страниц: [1]   Вверх
  Отправить эту тему    Печать  

 
Перейти в: