Помогите прочитать регулярное выражение

Тема в разделе "Регулярные выражения", создана пользователем UJy, 27 янв 2016.

Модераторы: xpert13
  1. UJy

    UJy

    Регистр.:
    23 авг 2011
    Сообщения:
    379
    Симпатии:
    132
    Ковыряю один модуль для Bitrix, который видоизменяет пагинацию.
    И в этом модуле 1 функция, которая проверяет урл и подменяет его.
    Вот эта функция:
    PHP:
    function __isPathTraversalUri($uri

        if ((
    $pos strpos($uri'?')) !== false) { 
            
    $uri substr($uri0$pos); 
        } 
        
    $uri trim($uri); 
        return 
    preg_match("#(?:/|2f|^|\\\\|5c)(?:(?:%0*(25)*2e)|\\.){2,}(?:/|%0*(25)*2f|\\\\|%0*(25)*5c|$)#i"$uri) ? true false

    $newUri preg_replace('#(pagen[\d]+/)#is'''$_SERVER['REQUEST_URI']); 
    if (!
    __isPathTraversalUri($newUri)) { 
        
    $_SERVER['REQUEST_URI'] = $newUri
    }
    Я примерно понимаю что она делает, но эта регулярка взрывает мне мозг. Может кто-нибудь написать её по-человечески? Или объяснить что она ищет в урле.
    Код:
    (?:/|2f|^|\\\\|5c)(?:(?:%0*(25)*2e)|\\.){2,}(?:/|%0*(25)*2f|\\\\|%0*(25)*5c|$)
    
     
  2. lag

    lag

    Регистр.:
    13 окт 2014
    Сообщения:
    237
    Симпатии:
    315
    Последнее редактирование: 27 янв 2016
    ProtmanFE, latteo и UJy нравится это.
  3. UJy

    UJy

    Регистр.:
    23 авг 2011
    Сообщения:
    379
    Симпатии:
    132
    А можно эту же регулярку написать каким-нибудь более простым языком? Без такого (?:%0*(25)*2e)
     
  4. javx

    javx

    Регистр.:
    28 авг 2015
    Сообщения:
    527
    Симпатии:
    252
    Сперва нужно определится что должно твое регулярное выражение обрабатывать. isPathTraversalUri() она проверяет есть ли путь в строке. Чем она сейчас не устраивает? приведи все возможные варианты этого пути что бы тебе помогли переписать регулярку.
     
  5. UJy

    UJy

    Регистр.:
    23 авг 2011
    Сообщения:
    379
    Симпатии:
    132
    Велосипед не мой и есть подозрения, что такая регулярка написана с целью помешать переписыванию модуля под свои нужды (что б такие как я колупали поменьше).
    Отсюда и вопрос: что ищет эта регулярка. Как только я узнаю "что именно она ищет" - смогу написать новую регулярку сугубо под свои нужды.
    Не пишу свою сразу только по одной причине - я не могу понять что она проверяет и я стремаюсь насчет "не начнет ли модуль ломать работу сайта после написания моей регулярки".

    Данная "штука" является составной частью модуля, который преобразует пагинацию Битрикса с вида site.ru/news/?PAGEN_1=2/ в урлы вида site.ru/news/pagen2/ и не преобразует всё остальное.