Мне нужен пример кода 2 или 3 строка чем 400 строка готовый класс в паблике. Хочу писать свой код чем готовый брать, а то путаница.. Как сделать у роутера ткаой чтоб Код (PHP): "'/home/{id}'" Где {id} - устанавливаем в массив. А то не нашел функция для такого действия!! Добавлено спустя 9 минут 51 секунду: Сделал так но 2 раза повторяет. Код (PHP): preg_match_all( "|{(.*)}|U", "/{id}/{page}", $out, PREG_PATTERN_ORDER ); echo '<pre>'; print_r($out); echo '</pre>';
с кавычками у тебя беда. тебе надо преобразовать эту строку в что-то вроде '/home/(?<id>.+)' тогда ты сможешь через preg_match() проверять URI на совпадение и вытаскивать параметры по имени.
artoodetoo, не напишеш маленко код? А то 7 часов пишу его и толку... А готовый в инете брать не хочеться! А то застряну в середине кода за день =)
artoodetoo, пример желательно! А то за 7 часов делал что ты сказал не помогает как я хотел! Добавлено спустя 28 минут 40 секунд: Код (PHP): $url = '/news/2/2'; $route = '/news/[i:name]/[i:id]'; $regex = $this->compileRoute($route); preg_match($regex, $url, $params); echo '<pre>'; print_r($params); echo '</pre>'; private function compileRoute($route) { if (preg_match_all('`(/|\.|)\[([^:\]]*+)(?::([^:\]]*+))?\](\?|)`', $route, $matches, PREG_SET_ORDER)) { $matchTypes = array( 'i' => '[0-9]++', 'a' => '[0-9A-Za-z]++', 'h' => '[0-9A-Fa-f]++', '*' => '.+?', '**' => '.++', '' => '[^/\.]++' ); foreach($matches as $match) { list($block, $pre, $type, $param, $optional) = $match; if (isset($matchTypes[$type])) { $type = $matchTypes[$type]; } if ($pre === '.') { $pre = '\.'; } $pattern = '(?:' . ($pre !== '' ? $pre : null) . '(' . ($param !== '' ? "?P<$param>" : null) . $type . '))' . ($optional !== '' ? '?' : null); $route = str_replace($block, $pattern, $route); } } return "`^$route$`u"; } Ушел 1 час но вроде нормально. Но хочеться чтобы в конфиге можно указать ключ. При проверка являет ли текст или число или максимальный число или строка длины и так далее... Будем пилить +) Добавлено спустя 40 минут 27 секунд: Я уже запуталься!!! '`(/|\.|)\[([^:\]]*+)(?:[^:\]]*+))?\](\?|)`' нужно заменить с [] на {} но я его изменил так то не робит почему?
Воспользуйтесь сервисом вроде https://regex101.com/ для теста. Это быстрее, чем править в коде, а затем смотреть на результат )
romach, о спс уменшил строка чем длинний был =) стал preg_match_all('/{(.*?)}/', $route, $matches, PREG_SET_ORDER) спс за сервис ускорил работу =) Добавлено спустя 3 минуты 54 секунды: Тема #! Вложу если кому будет нужен =) Код (PHP): $url = '/news/2/2'; $route = "/news/{id}/{name}"; $key = array( 'id' => '[0-9]++', 'name' => '[0-9]++' ); $regex = compileRoute($route); preg_match($regex, $url, $params); echo '<pre>'; print_r($params); echo '</pre>'; function compileRoute($route) { if (preg_match_all('/{(.*?)}/', $route, $matches, PREG_SET_ORDER)) { foreach($matches as $match) { list($block, $param) = $match; if (isset($matchTypes[$type])) { $type = $matchTypes[$type]; } foreach($key AS $name => $value) { if($name == $param) { $type = $value; } } $pattern = '(?:' . '(' . ($param !== '' ? "?P<$param>" : null) . $type . '))'; $route = str_replace($block, $pattern, $route); } } return "`^$route$`u"; }