регулярка на адресе

GrayHound

Новичок
регулярка на адресе

замкнуло совсем.
Нужно url пропасить:
subdomain.domain.zone/module/action/param1=test1/param2=test2/
PHP:
    $url = "subdomain.domain.zone/module/action/param1=test1/param2=test2/";
    $allnum = "[A-Za-z0-9]*";
    $match = preg_match("/(".$allnum.")[\.]*(".$allnum.")[\.]*(".$allnum.")[\.]*\/(".$allnum.")[\/]*(".$allnum.")(.*)/", $url, $matches);
а замкнуло вот на чём - далеко не всё может быть перечисленное в строке.
С субдоменом, доменом и зоной всё просто - там 3 результата в любом случае, независимо от того указан ли домен или зона.
Отсутсвие module или action или вместе взятых убивает всю мою и без того идиосткую логику.

Говорю сразу - последний элемент (.*) как сделать верно до меня тоже не доходит. Тут видимо нужно бы рекурсию, в использовании который я наглухо запутался. Вид ячейки для $matches типа [$n] => "param1=test" вполне устроит.

Есть ещё вариант сделать /module/action/params=param1/param2/param3.... Но params= тоже может отсутствовать...

Подскажите хоть кто чего. Мануалы по регуляркам читаются тяжело =/.

Вобщем нужно - элементы 1,2,3 - под имя сервера. 4,5-модуль/действие (если нет пустые), 6+ - параметры...
 

A1x

Новичок
может лучше обойтись без регулярок?

PHP:
$urlinfo = parse_url($url);
$pathinfo = split('/', $urlinfo['path']);
и т.д.
 

GrayHound

Новичок
может тогда вообще регулярными выражениями не пользоваться, ага?
 

Фанат

oncle terrible
Команда форума
вообще всегда или вообще для решения этой твоей конкретной проблемы?
 

GrayHound

Новичок
мда и кстати именно на такой вид, который я указал - parse_url не подействует.... да и parse_url посути регулярка...
 

Фанат

oncle terrible
Команда форума
разумеется. поскольку это не урл, а какой-то кривой огрызок.
впрочем, explode тебе все равно поможет.
ещё вопросы будут?
 

GrayHound

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

с explode вышло всё гораздо проще всё таки....
в конце концов сервернейм и ури я получаю отдельно....

насчёт этой здоровой функции - у меня сейчас меньше выходит это раз. И аргументы в стандартном виде мне почему-то не хочется выводить в строке - это два....
 

Фанат

oncle terrible
Команда форума
в результате у тебя все получилось одним explode? вопрос решён?
 

GrayHound

Новичок
ну не одним конечно. Получилось в итоге 3 - одна под сервернейм, вторая под ури, третья под параметры в ури, только разбил их по разным функциям в классе для удобства.

В итоге получается то что нужно, но код эстетически выглядит не очень. Ну и пара свитчей безсмысленных добавилось. Вышло вроде этого:
PHP:
    $parsed_host = $this->parseHost();
    $parsed_uri = $this->parseUri();

 private function parseHost()
  {
    $host = $this->getHost();
    $host_split = explode(".", $host);
    if (NWEConfig::getInstance()->getConfig("framework", "debug_state")) {
      switch (count($host_split)) {
        case "1":
          $return_array = array(
            "domain" => $host_split[0],
            "subdomain" => "",
          );
          break;
        case "2":
          $return_array = array(
            "domain" => $host_split[1],
            "subdomain" => $host_split[0],
          );
          break;
      }
    } else {
      switch (count($host_split)) {
        case "2":
          $return_array = array(
            "domain" => $host_split[0].$host_split[1],
            "subdomain" => "",
          );          
          break;
        case "3":
          $return_array = array(
            "domain" => $host_split[1].$host_split[2],
            "subdomain" => $host_split[0],
          );          
          break;
      }
    }
    return $return_array;
  }

  private function parseUri()
  {
    $uri = $this->getUri();
    $uri = NWELoaderUrl::junkEdgeslashes($uri);
    $uri_split = explode("/", $uri);
    $params = array();
    $not_params = 0;
    //для начала определим параметры, заодно и посчитаем что не является параметрами
    foreach ($uri_split as $part) {
      $part_split = explode("=", $part);
      if (count($part_split) == 1) {
        $not_params++;
      } else {
        $params[$part_split[0]] = $part_split[1];
      }
    }
    //в зависимости от $not_params формируем $module и $action
    switch ($not_params) {
      case 2:
        $module = $uri_split[0];
        $action = $uri_split[1];
        break;
      case 1:
        $module = $uri_split[0];
        $action = "";
        break;
      case 0: 
        $module = "";
        $action = "";
        break;
    }
    return array(
      "module" => $module,
      "action" => $action,
      "params" => $params,
    );
  }
 
Сверху