Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.05.2012, 14:41   #1
dem66
Форумчанин
 
Регистрация: 31.05.2011
Сообщений: 316
Восклицание Организация роутинга, регулярные выражения

Добрый день коллеги.
Есть функция роутинга, хочу к ней прицепить регулярные выражения.

Например чтото типа этого.
Код:
routes.housing.type = "Zend_Controller_Router_Route_Regex"
routes.housing.route = "housing_(\d+)\.html"
routes.housing.defaults.controller = "index"
routes.housing.defaults.action = "showhousing"
routes.housing.map.1 = id
Все это дело хранится в ини файле и парсится в массив.

Мой вариант(без регулярок):
Код:
forumdisplay.module="Forum"
forumdisplay.controller="Forum"
forumdisplay.action="Forumdisplay"
Сам метод (часть вырезана):
PHP код:
protected function _initRoutes()
    {
              
$router Config::Ini(APPLICATION_PATH.'/configs/routers.ini''routers'1);

              
$url getRequest::getInstance()->Uri();

              
$count count($url);

            if(
$count == 1){
                        if(
array_key_exists($url[0], $router)){
                            
$controller $router[$url[0]]['controller'];
                            
$action $router[$url[0]]['action'];
                            
$module $router[$url[0]]['module'];
                        }else{
                            
$controller ucwords($url[0]);
                            
$action "Index";
                            
$module 'Default';
                        }
             }elseif(
$count == 2){
                        
$controller ucwords($url[0]);
                        
$action ucwords($url[1]);

                        if(
array_key_exists($url[0], $router)){
                            
$module $router[$url[0]]['module'];
                        }else{
                            
$module 'Default';
                        }
             }

        
$this->_controller $controller;
        
$this->_action $action;
        
$this->_module $module;
    } 
getRequest::getInstance()->Uri(); Возвращает массив, типа из адреса /index/show делает:

PHP код:
array(
      [
0]=>'index',
      [
1]=>'show'
); 
А вот так выглядит уже роспарсеный конфиг (урезан):
PHP код:
array(
    [
'index']=>array(
                                 [
'action']=>"Index"
                          
),
    [
'forum']=>array(
                                 [
'action']=>"forumdisplay"
                          
)

); 
Сейчас просто проверяется с помощью array_key_exists соотвествие ключу в массиве и все.
А надо както зделать чтобы в конфиге можно было писать регулярки, ну как я выше показал.
dem66 вне форума Ответить с цитированием
Старый 02.05.2012, 22:42   #2
dem66
Форумчанин
 
Регистрация: 31.05.2011
Сообщений: 316
По умолчанию

Че никто не подскажет?
dem66 вне форума Ответить с цитированием
Старый 07.05.2012, 17:28   #3
frommars
Форумчанин
 
Регистрация: 02.07.2011
Сообщений: 144
По умолчанию

а не проще
Код:
$arrURL=explode('/',$_SERVER['REQUEST_URI']);
?
frommars вне форума Ответить с цитированием
Старый 07.05.2012, 18:22   #4
dem66
Форумчанин
 
Регистрация: 31.05.2011
Сообщений: 316
По умолчанию

Причем тут эксплойд? эксплойд проверит прописаны ли этот роут в конфиге?
Не все так просто.
И на выходе уже должен быть результат - или реально существующий контролер, или альтернативный контролер (ну например для cms).

И оно какимто макаром должно по маске проверить. например прислали page_1

и оно должно запустить экшн page и передать ему id = 1

Я же об этом присалЭ, смотрите Zend'a
dem66 вне форума Ответить с цитированием
Старый 07.05.2012, 21:07   #5
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Так а в чем конкретно проблема?

Там нет ничего особо сложного:
- прописываем в конфиге регулярку (шаблон) - 'housing_(\d+)\.html'
- проверяем URL на соответствие этому шаблону - preg_match('#housing_(\d+)\.html#', $url_part)
- если соответствует, и содержит регулярки - выбираем совпадения в массив - preg_match_all('#housing_(\d+)\.htm l#', $url_part, $matches)
- формируем переменные из найденных совпадений - и передаем в action

Примеров реализации полно - посмотреть можно в любом фреймворке.
Andkorol вне форума Ответить с цитированием
Старый 08.05.2012, 14:18   #6
dem66
Форумчанин
 
Регистрация: 31.05.2011
Сообщений: 316
По умолчанию

вы редлагаете форичем перебирать весь массив и искать в нем совпадения прегмачем? уто же уйма времени
dem66 вне форума Ответить с цитированием
Старый 08.05.2012, 14:50   #7
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от dem66 Посмотреть сообщение
вы редлагаете форичем перебирать весь массив и искать в нем совпадения прегмачем? уто же уйма времени
А как вы хотите использовать в роутинге регулярные выражения - без использования регулярных выражений..?? o_O

"весь массив" - это сколько элементов? Сомневаюсь, что прям огромное количество.
"уйма времени" - это с чего бы? Есть замеры какие-то? Пробовали реализовать? Показывайте код в таком случае - померяем вместе!

Тема висит неделю - а никакого нового кода не видно.
Andkorol вне форума Ответить с цитированием
Старый 08.05.2012, 15:19   #8
dem66
Форумчанин
 
Регистрация: 31.05.2011
Сообщений: 316
По умолчанию

Ну както так:
PHP код:
<?php

require_once('library/Kernel/Load/Config.php');

$conf "Application/configs/routers.ini";

$Config Config::Ini($conf'test'1);

$url "test_10.html";


foreach(
$Config as $k=>$c){
    if(isset(
$c['type']) && $c['type']=='Route_Regex'){
        if(
preg_match('#'.$url.'#'$c['route'])){
            echo 
"ok";
        }
    }
}
Код:
Array
(
    [index] => stdClass Object
        (
            [module] => Default
            [controller] => Index
            [action] => Index
        )


    [test] => stdClass Object
        (
            [type] => Route_Regex
            [route] => test_(\d+)\.html
            [module] => Default
            [controller] => Demo
            [action] => Test
        )

)
dem66 вне форума Ответить с цитированием
Старый 08.05.2012, 16:15   #9
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от dem66 Посмотреть сообщение
Ну както так:
PHP код:
        if(preg_match('#'.$url.'#'$c['route'])){ 
Параметры перепутаны - у вас паттерн в $c['route'] находится, и сравнивать с ним вы должны $url.

После проверки - находите совпадения при помощи preg_match_all - и формируйте из этих совпадений переменные для передачи в соответствующий action.

Когда это все будет реализовано - проверяйте время выполнения и потребляемые ресурсы (Xdebug например).
И тогда уже делайте выводы - приемлем ли этот вариант для вас.
Andkorol вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Регулярные выражения в F# Лёличка Общие вопросы .NET 1 18.01.2012 20:15
Регулярные выражения C# Дупло Помощь студентам 4 28.09.2011 17:19
регулярные выражения CodeNOT PHP 2 23.09.2011 12:11
Регулярные выражения ololo-schoolboy PHP 2 15.05.2011 13:03
Регулярные выражения ACE Valery PHP 5 14.10.2009 11:37