Тема: Задачка для любителей регулярных выражений PHP :)

Уважаемые знатоки регулярок PHP (PCRE), у вас есть уникальная возможность:

1. блеснуть знаниями
2. помочь любимому форуму

В настоящее время на форуме есть бага в установленном плагине, который позволяет пользователям сохранять темы в закладки и просматривать свой список закладок.

Но при этом, если у пользователя больше 20 закладок, то список разбивается на страницы. И любая страница кроме первой начинает кидать 404 ошибку:

jediru.net/search/favorite/<user id>/ - OK
jediru.net/search/favorite/<user id>/page/2/ - 404

Сверхчеловеческим напряжением разума было установлено, что проблема возникает в следующем месте.

В коде расширения определены следующие правила:

            $forum_rewrite_rules['/^(favorite|unfavorite)[\/_-]?([0-9]+)[\/_-]?([a-z0-9]+)?(\.html?|\/)?$/i'] = 'misc.php?action=$1&tid=$2&csrf_token=$3';
            $forum_rewrite_rules['/^search[\/_-]?favorite[\/_-]?([0-9]+)(\.html?|\/)?$/i'] = 'search.php?action=show_favorite&user_id=$1';

То есть при помощи регулярных выражений URL вида /search/favorite/<user_id > парсится и приводится к виду search.php?action=show_favorite&user_id=<user_id>

Но при этом полностью игнорируется номер страницы.

Задачка: добавить в приведенный регекс выпарсивание и добавление к урлу параметра page_id.

Тому, кто найдет работающее решение - респект и уважуха :)

You have entered the Twilight Zone
Beyond this world strange things are known

Use the key, unlock the door, see what your fate might have in store
Come explore your dreams' creation, enter this world of imagination

Re: Задачка для любителей регулярных выражений PHP :)

Этот косяк везде - в черном списке, в рейтинге, в банном листе, подписках. Решите, пожалуйста, да.

Ночь в июле полна соблазнов,
И мятежна ночная даль,
Свыше путь тебе указан,
Знает Бог один - куда...

(15-04-2019 19:38:38 отредактировано СЧЕТ)

Re: Задачка для любителей регулярных выражений PHP :)

eyedol пишет:

помощи регулярных выражений

регулярные выражения это огонь :) , молодцы те кто их хорошо читает.
может этот сервис поможет https://regex101.com

"Когда чиновники расхищают быстрее чем народ производит, они заявляют, что народ не умеет работать."

Re: Задачка для любителей регулярных выражений PHP :)

СЧЕТ пишет:

может этот сервис поможет https://regex101.com

Как говорили декабристы, спасибо за ах...енную ссылку.

Кажется, я разобрался, вот что получилось у меня:

            $forum_rewrite_rules['/^(favorite|unfavorite)[\/_-]?([0-9]+)[\/_-]?([a-z0-9]+)?(\.html?|\/)?$/i'] = 'misc.php?action=$1&tid=$2&csrf_token=$3';
            $forum_rewrite_rules['/^search[\/_-]?favorite[\/_-]?([0-9]+)(\.html?|\/)?$/i'] = 'search.php?action=show_favorite&user_id=$1';
            $forum_rewrite_rules['/^search[\/_-]?favorite[\/_-]?([0-9]+)[\/_-]?page[\/_-]?([0-9]+)?(\.html?|\/)?$/i'] = 'search.php?action=show_favorite&user_id=$1&p=$2';

Сейчас админ придёт с прогулки, и попросим его протестировать.

You have entered the Twilight Zone
Beyond this world strange things are known

Use the key, unlock the door, see what your fate might have in store
Come explore your dreams' creation, enter this world of imagination

(16-04-2019 09:12:58 отредактировано OperaTor)

Re: Задачка для любителей регулярных выражений PHP :)

регекспы конечно хороши, но для таких целей проще просто разбить урл  на части (split) и уже из частей собирать правильный урл

Re: Задачка для любителей регулярных выражений PHP :)

нормально обновили

Господи,моя гениальность становится тяжким бременем.Помоги мне.(с) П. Кокс.
Я вернулся, с***!

(18-04-2019 04:29:37 отредактировано MIIB)

Re: Задачка для любителей регулярных выражений PHP :)

eyedol пишет:

Кажется, я разобрался

язык очень похожий на Perl, который тоже был ориентирован на текстовую обработку, но работал с интерпретатором, а php чем отличается, тем что компилирует код? Удивительные языки, одной строчкой можно перелопатить огромные массы текста

У меня в 2000х был чат, где я разрабатывал систему антимат. Эта система подменяла матерные слова нормальными. И я говорил всем, материтесь, если получится, а если получится, то я новые алгоритмы придумаю... в конечном итоге матерного запаса и фантазии не хватало, чтобы показать матерное слово... мои алгоритмы учитывали всё, от подмены букв латинскими, до вставки между матерными буквами спецсимволов

По коду видно, что Стася всех круче


foreach $pair (@pairs)
{
    ($name, $value) = split(/=/, $pair);
    $value =~ tr/+/ /;
    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
    open (FILE,"<$filter");@LINES=<FILE>;close(FILE);
    $value =~ s/<!--(.|\n)*-->//g;
    foreach $_ (@LINES)
    {
    chop;
    chop;
if ($value =~ /$pass/){$access=1};$value =~ s/$pass//;
if ($value =~ /$pass1/){$access=2;};$value =~ s/$pass1//;
    if ($value =~ /<(.)*?$_(.)*(>|\n)/i)
     {
    if ($name ne 'say')
      {
    $value =~ s/<([^>]|\n)*>//g;
    $value =~ s/</&lt/g;
          } else {$clear=1}
     }
    }
    $FORM{$name} = $value;
$all_logs.="|$name=$value";

}
&log("$all_logs\n---------");$all_logs='';
$FORM{say}=$FORM{say_bak} if !$FORM{say}&&$FORM{say_bak};

$userIP = $ENV{'REMOTE_ADDR'};

#Stasya======

#print <<EOM if $userIP=~/195.128.139./;
#Error
#<script>
#top.location.href="index.htm"
#</script>
#EOM

Летать рождённый, не должен ползать...