Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Обработка рекурсивом данных адресной строки.


Автор: Zmiuko 23.3.2009, 06:49
Проблема, что не могу подобрать хороший Паттерн.

Запрос в адресной строке выглядит следующим:

?mod=new&mc=mod&cm=to&page=12, допустим. 



Необходимо обработать функцией так чтобы получить стрку следующего вида

?file=mod-mc-cm-page-pr-new-mod-to-122.pl // Важно: где переменные какие угодно и сколько угодно

где названия Get-переменных идут в левую сторону от "-pr-", аих соответственные значения в правую и к концу строки прибавляется "2.pl"... 

Возможно ли применить к вышеуказанному запросу рекурсивную функцию, дабы не прибегать к разбору строки в массив и дальнейшей сортировке ключей, а затем при помощи implode обратно в строку?

Паттерн сложно подобрать, поскольку беспокоюсь о безопасности.

Борюсь с уменьшением нагрузки.

Автор: ksnk 23.3.2009, 08:40
поторопился... :-(

Автор: Zmiuko 23.3.2009, 10:51
Цитата

поторопился... :-(

 smile 

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


Автор: enof 23.3.2009, 14:53
Код

<?php
$str = "?mod=new&mc=mod&cm=to&page=12";
$pattern = "#\??([^=&]*)=([^&]*)#iu";
preg_match_all($pattern, $str, $arr_matches);
$result = "?file=".implode("-",$arr_matches[1])."-pr-".implode("-", $arr_matches[2])."2.pl";
echo $result;
?>

Цитата(Zmiuko @  23.3.2009,  06:49 Найти цитируемый пост)
Паттерн сложно подобрать, поскольку беспокоюсь о безопасности.

чего именно боитесь?

Автор: Zmiuko 23.3.2009, 15:09
Дело в том, что при инкудинге кода, я в нем превращал ссылки функцией:

Код

function re_prav_url($u) {
            $str = substr($u, 1);
            $str2 = explode('&', $str);
                for($i=0;$i<count($str2);$i++) {
                    list($a0, $a1) = explode('=', $str2[$i]);
                    $aa[] = $a0;
                    $ab[] = $a1;
                }
            $str = '?file='.implode('-',$aa).'-pr-'.implode('-',$ab).'2.pl';
            return $str;
        }


создавая определенную нагрузку на сервер, поскольку использовал лишний цикл... 

Выходные же ссылки ?file=*2.pl я парсю функцией:

Код

    function prav_url($str) {
        if(trim(strtolower(strrchr($str, "."))) == ".pl") { $str = explode(".",$str); $str = $str['0']; }
        $arg = substr($str, -1);
        if($arg == '2') {
            $str = substr($str, 0, -1);
            $str = substr($str, 5);
            $str = explode('-pr-', $str);
            $str1 = explode('-', $str['0']);
            $str2 = explode('-', $str['1']);
            for($i=0;$i<count($str1);$i++) {
                $array[$str1[$i]] = $str2[$i];
            }
            return $array;
        } else {
            #$str = substr($str, 1);
            $str2 = explode('&', $str);
            for($i=0;$i<count($str2);$i++) {
                list($a0, $a1) = explode('=', $str2[$i]);
                $array[$a0] = $a1;
            }
            return $array;
        }
    }


Можно ли применить так же паттерн обратив ссылки обратно в исходные из file=mod-mc-cm-page-pr-new-mod-to-122.pl в mod=new&mc=mod&cm=to&page=12

Автор: enof 23.3.2009, 15:17
Цитата(Zmiuko @  23.3.2009,  15:09 Найти цитируемый пост)
Можно ли применить так же паттерн обратив ссылки обратно в исходные из file=mod-mc-cm-page-pr-new-mod-to-122.pl в mod=new&mc=mod&cm=to&page=12 

Можно, только объясните, зачем все это?

Автор: Zmiuko 23.3.2009, 15:21
Да дело в том, что предаю ссылку скрипту на perl сервере smile Паттерн плохо подбираю (

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)