Вопрос по вытягиванию данных из текста, и занесения их в GET в качестве переменной

Spear

почемучка
Вопрос по вытягиванию данных из текста, и занесения их в GET в качестве переменной

Здравствуйте. у меня такая проблемка6
есть раздел на сайте, и вот чтобы в нем серфить по различным категориям, и фильтровать нужную информацию, мне посоветовали собирать всю нужную информацию для фильтрации в переменную, и потом её разбивать.

Вообщем например
http://www.site.com/encyclopedia/type11/y2005/s
этот код должен бы показать мне все обьекты, тип которых 11, названия начинаются на букву 'S' и выпущенные в 2005 году.

ДО это я делал так - просто какждый параметр, нарпимер год, бралось отдельно из ГЕТА. ну тоесть $year = $_GET['year']
.
Сейчас я, не без помощи форумчан РНРКЛАБА, сделал так:
что type11/y2005/s - это все одна переменная, $id, и нижеследующим кодом я получаю нужные мне данные.

Вроде бы все нормально получается, и корректно выбираются данные по каждой переменной, но теперь у меня такая прорблема - как мне передавать эти данные между различными скриптами? Ведь в $_GET теперь каждой переменнйо отдельно нету.

Поэтому вопрос - как поступить?
Вот сам код, вроде работает:
PHP:
$filterString =  $_GET['id']; 
   $filterStringExpl = explode ("/", $filterString); 
   $test3 = count($filterStringExpl); 
   $t=0; 
   while($t<$test3) 
   { 
   if (preg_match("/^[y][0-9]{4}$/", $filterStringExpl[$t])) 
   { 
        preg_match_all('/(?:([0-9]+)|.)/i', $filterStringExpl[$t], $matches2); 
        $test6 = strtolower(implode('', $matches2[1])); 
        $year="$test6"; 
         
   } 
   if (preg_match("/^ge[0-9]{1}$/", $filterStringExpl[$t])) 
   { 
        preg_match_all('/(?:([0-9]+)|.)/i', $filterStringExpl[$t], $matches2); 
        $test6 = strtolower(implode('', $matches2[1])); 
        $ge="$test6"; 
   } 
   if (preg_match("/^ge[0-9]{2}$/", $filterStringExpl[$t])) 
   { 
        preg_match_all('/(?:([0-9]+)|.)/i', $filterStringExpl[$t], $matches2); 
        $test6 = strtolower(implode('', $matches2[1])); 
        $ge="$test6"; 
   } 
   if (preg_match("/^st[0-9]{1}$/", $filterStringExpl[$t])) 
   { 
        preg_match_all('/(?:([0-9]+)|.)/i', $filterStringExpl[$t], $matches2); 
        $test6 = strtolower(implode('', $matches2[1])); 
        $st="$test6"; 
   } 

   $t++; 
   }
 

Silex

unitecsys
Spear, опиши подробнее, что тебе нужно. Ты получил свои объекты и теперь в другом скрипте хочешь с ними работать? Ну так и используй свой метод дальше, формируй таким же образом адрес, чтобы и в другом скрипте точно так же извлекать информацию из адреса.

PS. Приведенный код очень неоптимальный...
 

Фанат

oncle terrible
Команда форума
вот чтобы в нем серфить по различным категориям, и фильтровать нужную информацию, мне посоветовали собирать всю нужную информацию
почему тбы тебе не спросить у тех, кто тебе даёт советы?
 

Spear

почемучка
Silex
А как бы его улучшить? Не хотелось бы использовать этот код каждый раз, особенно если он плохой :(

-~{}~ 08.06.05 20:09:

Народ. ну серьезно, подскажите пожалуйста!
Я уже всю логику навигации переписывать собрался, и незнаю - использовать ли вышеприведенный код :(
модя задача - из переменной
/ty32/y2006/q2424/qwrey34/wret/qeryvqeh/e4y/st0

вытащить ty32 и сделать это переменной $type=32 (это я уже сделал)
вытащить y2006 и сделать это переменной $year=2006 (это я уже сделал)
вытащить st0 и сделать это переменной $status=0 (это я уже сделал)

НО проблема вот в чем:
от того. какие параметры указал пользователь, у меня будут изменяться некоторые ссылки на странице. Раньше я делал как (когда у меня каждый отделдьный параметр брался из гета)
if ((isset($_GET['year'])) and (!empty($_GET['year'])))
{
$year =$_GET['year'];
$yearLink = "&year=$year";
}
else {$yearLink == "";}
и во все места формирования ссылок вставлял $yearLink. (и другие переменные).

А теперь как лучше? Вот я и спрашиваю - подойдет ли мой код, если посещаемость на сайте 3-4 тысячи в день?
 

SiMM

Новичок
> Раньше я делал как (когда у меня каждый отделдьный параметр брался из гета)
Вот и продолжай в том же духе - зачем переделывать на
> /ty32/y2006/q2424/qwrey34/wret/qeryvqeh/e4y/st0
?
 

IBSN

Новичок
Spear, а почему бы не сделать, как вариант, только для определения страницы адрес "/test/test2/rus/one/", и уже к этому адресу добавлять свои значения. К примеру, для себя я написал класс для обработки адреса, у меня выглядит это так: "/test/test2/rus/one/&year=2005&day=10&month=02"...
 

Spear

почемучка
вот. в этом топике - http://phpclub.ru/talk/showthread.php?s=&threadid=68080&rand=18 там подробно написано помчему я делаю именно так..
Просто так в двух словах и не передам.
вкратце - нужно сделать так, чтобы юзер мог попасть на нужную страницу и по ссылке
http://www.site.com/encyclopedia/y2005/ty1/st0
и по ссылке
http://www.site.com/encyclopedia/y2005/st0/ty1
и по ссылке
http://www.site.com/encyclopedia/ty1/st0y2005/
и по ссылке
http://www.site.com/encyclopedia/y2005/ty1

тоесть сделать НЕ фиксированным кол-во данных для фильтрации, а легко меняемым и настраевоемым.
 

Фанат

oncle terrible
Команда форума
чувак.
ты запарился проблемой которая никому не нужна.
ради бога. тебя никто не отговаривает.
Но почему другие должны решать за тебя задачу, которая им не интересна/не нужна сто лет в обед?

ну хочешь ты параметры в произвольном порядке - делай. А мы-то тут при чём? Нам вполне хватает фиксированного.

Никаких особеных знаний именно ПХП для решения твоей задачи не нужно. Только логика и составление алгоритма.
занимайся.
Оно ТЕБЕ надо. Ты себе это придумал. Вот и пиши. Сам.
Не надо просить, чтобы тебе написал чужой дядя.
Я понимаю - нужды была бы понятная. А так - твоя левая нога захотела - и все должны срочно за тебя писать.
 

Spear

почемучка
Да я же не прошу писать за меня,
я прошу профессионалов глянуть на мой код, и сказать - приемлимо ли его использование при огромном кол-ве пользователей, и как его лучше оптимизировать.

код:
PHP:
$filterString =  $_GET['id']; 
   $filterStringExpl = explode ("/", $filterString); 
   $test3 = count($filterStringExpl); 
   $t=0; 
   while($t<$test3) 
   { 
   if (preg_match("/^[y][0-9]{4}$/", $filterStringExpl[$t])) 
   { 
        preg_match_all('/(?:([0-9]+)|.)/i', $filterStringExpl[$t], $matches2); 
        $test6 = strtolower(implode('', $matches2[1])); 
        $year="$test6"; 
         
   } 
   if (preg_match("/^ge[0-9]{1}$/", $filterStringExpl[$t])) 
   { 
        preg_match_all('/(?:([0-9]+)|.)/i', $filterStringExpl[$t], $matches2); 
        $test6 = strtolower(implode('', $matches2[1])); 
        $ge="$test6"; 
   } 
   if (preg_match("/^ge[0-9]{2}$/", $filterStringExpl[$t])) 
   { 
        preg_match_all('/(?:([0-9]+)|.)/i', $filterStringExpl[$t], $matches2); 
        $test6 = strtolower(implode('', $matches2[1])); 
        $ge="$test6"; 
   } 
   if (preg_match("/^st[0-9]{1}$/", $filterStringExpl[$t])) 
   { 
        preg_match_all('/(?:([0-9]+)|.)/i', $filterStringExpl[$t], $matches2); 
        $test6 = strtolower(implode('', $matches2[1])); 
        $st="$test6"; 
   } 

   $t++; 
   }
 

SelenIT

IT-лунатик :)
Spear
Во-первых, несколько урлов для одной страницы - вредно не только с точки зрения сложности обработки, но и с точки зрения поисковой оптимизации - индекс цитирования этой страницы поисковиками будет "размазан" по разным адресам.

Во-вторых, как минимум никогда не стоит брать переменные в кавычки. Более того, переменная $test6 в этом коде вообще абсолютно не нужна.

В третьих, мало понятен смысл preg_match_all-а с последующей склейкой массива при разборе параметров, если нужная последовательность по определению только одна и получить ее можно в одном preg_match с проверкой.

В четвертых - два разных if-а для однозначного и двузначного ge соотв-но - без комментариев.

Вот пока все, что заметил...
 

Spear

почемучка
>Во-вторых, как минимум никогда не стоит брать переменные
>в кавычки. Более того, переменная $test6 в этом коде
>вообще абсолютно не нужна.
исправил

>В третьих, мало понятен смысл preg_match_all-а с
>последующей склейкой массива при разборе параметров,
>если нужная последовательность по определению только
>одна и получить ее можно в одном preg_match с проверкой.
Эту функцию отделения текста от цифр я взял прямо с php.net, поэтому не знаю ка кона работает, я вообще с регулярными выражениями не мастер. разве что примитив. Так что тут исправить нужно?

>В четвертых - два разных if-а для однозначного и
>двузначного ge соотв-но - без комментариев.
Тут я даже незнаю как сделать. Ведь ge может быть и однозначным двузначным.

SelenIT
Спасибо большое!

А вообще по поводу поисковиков - они по идее на эти страницы (фильтрации) не попадут, так как чтобы попасть нас траницу. например, http://...../encyclopedia/ge1/y2005/st0 нужно выбрать эти параметры в настройеках фильтра. нажать "фильтровать" и ява скрипт откроет окно с нужными параметрами. Так что поисковики будут ходить итолько по
http://...../encyclopedia/a/
http://...../encyclopedia/b/ и так далее - по ссылкам на разделы по первой букве.
 

SelenIT

IT-лунатик :)
Как примерный вариант для твоей переменной ge (с 1-ой или 2-мя цифрами):
PHP:
if (preg_match("/^ge([0-9]{1,2})$/", $filterStringExpl[$t],$matches2)) $ge=$matches2[1];
А регулярки изучать нужно...
 

Spear

почемучка
SelenIT
Спасибо большое! щас Фанат опять скажет что ненужно новичкам код писать. что очень ты добрый :) Ещё раз спасибо!
 

SelenIT

IT-лунатик :)
Spear
Не стоит благодарности. Это же твой код, просто из него выброшено кое-что ненужное :)
 

Мутник

Новичок
а еще лучше (хотя ХЗ что тут лучше)

сначала экспложишь все по слешам, потом отделяешь "буквы" от циферок, а потом ставишь между ними равно.

это 3 строчки ;) и не надо париться так,как это делаешь ты

P.S. а вообще, наверное, не надо вообще так делать
 

Spear

почемучка
Мутник
это конечно неплохо, но в моём варианте будет работаь и такая строка:

////341355/46/2/6r/g/e56f2cq/45e7/y2005////4352q/q/2/ge40

а в предложенном тобою - наверное нет
 

SiMM

Новичок
> А вообще по поводу поисковиков - они по идее на эти страницы (фильтрации) не попадут
Это заблуждение. Ссылку на эту страницу может оставить и человек например на своей страничке или на каком-нибудь форуме.
 

Фанат

oncle terrible
Команда форума
Вот оно, извращение идеи ЧПУ в натуральном виде.
Человек слышал звон, и теперь лепит его со всей дури везде, куда руки дотянутся.

SelenIT, ты не вступил случайно в орден монашек-сердобольниц? Очень похоже.
 
Сверху