За последние 24 часа нас посетили 30849 программистов и 1444 робота. Сейчас ищет 881 программист ...

Из строка выташить значение как у роутера!

Тема в разделе "PHP для новичков", создана пользователем engine.energy, 29 июн 2015.

  1. engine.energy

    engine.energy Новичок

    С нами с:
    31 май 2015
    Сообщения:
    149
    Симпатии:
    0
    Мне нужен пример кода 2 или 3 строка чем 400 строка готовый класс в паблике.

    Хочу писать свой код чем готовый брать, а то путаница..

    Как сделать у роутера ткаой чтоб

    Код (PHP):
    1. "'/home/{id}'"
    Где {id} - устанавливаем в массив.

    А то не нашел функция для такого действия!!

    Добавлено спустя 9 минут 51 секунду:
    Сделал так но 2 раза повторяет.

    Код (PHP):
    1.         preg_match_all(
    2.             "|{(.*)}|U",
    3.             "/{id}/{page}",
    4.             $out,
    5.             PREG_PATTERN_ORDER
    6.         );
    7.  
    8.         echo '<pre>';
    9.         print_r($out);
    10.         echo '</pre>'; 
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    с кавычками у тебя беда.

    тебе надо преобразовать эту строку в что-то вроде '/home/(?<id>.+)' тогда ты сможешь через preg_match() проверять URI на совпадение и вытаскивать параметры по имени.
     
  3. engine.energy

    engine.energy Новичок

    С нами с:
    31 май 2015
    Сообщения:
    149
    Симпатии:
    0
    artoodetoo, не напишеш маленко код? А то 7 часов пишу его и толку... А готовый в инете брать не хочеться! А то застряну в середине кода за день =)
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    ты хотел сам — делай сам.
     
  5. engine.energy

    engine.energy Новичок

    С нами с:
    31 май 2015
    Сообщения:
    149
    Симпатии:
    0
    artoodetoo, пример желательно! А то за 7 часов делал что ты сказал не помогает как я хотел!

    Добавлено спустя 28 минут 40 секунд:
    Код (PHP):
    1. $url = '/news/2/2';
    2.         $route = '/news/[i:name]/[i:id]';
    3.  
    4.         $regex = $this->compileRoute($route);
    5.         preg_match($regex, $url, $params);
    6.  
    7.         echo '<pre>';
    8.         print_r($params);
    9.         echo '</pre>';
    10.  
    11. private function compileRoute($route)
    12.     {
    13.         if (preg_match_all('`(/|\.|)\[([^:\]]*+)(?::([^:\]]*+))?\](\?|)`', $route, $matches, PREG_SET_ORDER)) {
    14.  
    15.             $matchTypes = array(
    16.                 'i'  => '[0-9]++',
    17.                 'a'  => '[0-9A-Za-z]++',
    18.                 'h'  => '[0-9A-Fa-f]++',
    19.                 '*'  => '.+?',
    20.                 '**' => '.++',
    21.                 ''   => '[^/\.]++'
    22.             );
    23.  
    24.             foreach($matches as $match) {
    25.                 list($block, $pre, $type, $param, $optional) = $match;
    26.  
    27.                 if (isset($matchTypes[$type])) {
    28.                     $type = $matchTypes[$type];
    29.                 }
    30.                 if ($pre === '.') {
    31.                     $pre = '\.';
    32.                 }
    33.  
    34.                 $pattern = '(?:'
    35.                     . ($pre !== '' ? $pre : null)
    36.                     . '('
    37.                     . ($param !== '' ? "?P<$param>" : null)
    38.                     . $type
    39.                     . '))'
    40.                     . ($optional !== '' ? '?' : null);
    41.  
    42.                 $route = str_replace($block, $pattern, $route);
    43.             }
    44.  
    45.         }
    46.         return "`^$route$`u";
    47.     }
    Ушел 1 час но вроде нормально. Но хочеться чтобы в конфиге можно указать ключ. При проверка являет ли текст или число или максимальный число или строка длины и так далее... Будем пилить +)

    Добавлено спустя 40 минут 27 секунд:
    Я уже запуталься!!!

    '`(/|\.|)\[([^:\]]*+)(?::([^:\]]*+))?\](\?|)`' нужно заменить с [] на {} но я его изменил так то не робит почему?
     
  6. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Воспользуйтесь сервисом вроде https://regex101.com/ для теста. Это быстрее, чем править в коде, а затем смотреть на результат )
     
  7. engine.energy

    engine.energy Новичок

    С нами с:
    31 май 2015
    Сообщения:
    149
    Симпатии:
    0
    romach, о спс уменшил строка чем длинний был =) стал preg_match_all('/{(.*?)}/', $route, $matches, PREG_SET_ORDER)

    спс за сервис ускорил работу =)

    Добавлено спустя 3 минуты 54 секунды:
    Тема #!

    Вложу если кому будет нужен =)

    Код (PHP):
    1.         $url = '/news/2/2';
    2.         $route = "/news/{id}/{name}";
    3.         $key = array(
    4.                     'id' => '[0-9]++',
    5.                     'name' => '[0-9]++'
    6.                 );
    7.  
    8.         $regex = compileRoute($route);
    9.         preg_match($regex, $url, $params);
    10.  
    11.         echo '<pre>';
    12.         print_r($params);
    13.         echo '</pre>';
    14.   
    15.  
    16.     function compileRoute($route)
    17.     {
    18.         if (preg_match_all('/{(.*?)}/', $route, $matches, PREG_SET_ORDER)) {
    19.  
    20.             foreach($matches as $match) {
    21.  
    22.                 list($block, $param) = $match;
    23.  
    24.                 if (isset($matchTypes[$type])) {
    25.                     $type = $matchTypes[$type];
    26.                 }
    27.  
    28.                 foreach($key AS $name => $value) {
    29.                     if($name == $param) {
    30.                         $type = $value;
    31.                     }
    32.                 }
    33.  
    34.                 $pattern = '(?:' . '(' . ($param !== '' ? "?P<$param>" : null) . $type . '))';
    35.  
    36.                 $route = str_replace($block, $pattern, $route);
    37.             }
    38.  
    39.         }
    40.         return "`^$route$`u";
    41.     }