Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > router и регулярка остается последний символ


Автор: Sanchezzz 22.8.2012, 07:03
Доброе утро или ночь)
Есть собственный роутер который допиливаю, возникла проблема я не пойму откуда берется последний символ при всех манипуляциях с регулярками

Код

class router
//...

        const REGEX_KEY    = '#:([\w]+)\+?#u';
    const REGEX_SEGMENT = '[^/.,;?\n]+';
    const REGEX_ESCAPE  = '[.\\+*?[^\\]${}=!|]';
    
    protected 
        $controler = null ,      // Обьявлен контролер
        $include_file = null,    // Подключение файла
        $path = '',              // Путь патерен
        $regex = '',             // Полная регулярка
        $param = array();


      public static function make($name ,  $params){} 

/**
     * TODO Компиляция 
     * $url    /:controler/:action
     * $params array(':controler'=>'[\w]+') // собственные параметры чтобы подставить собственные регулярки на определенные параметры
     */
    public static function compile($url , $params ){
        preg_match_all(self::REGEX_KEY, $url ,$match);
        $condition_key = array_values($match[0]);
        
        $search = array();
        foreach ( array_keys($params) as $key ) {
            $search[] = '#:' . ltrim($key,':') . '\+?(?!\w)#';
        }
        $pattern = preg_replace($search, $params, $url );
        preg_replace('#\(/?:.+\)|\(|\)#', '', $pattern);
            
        $preg_url = '#^'.str_replace( $condition_key , self::REGEX_SEGMENT  , $pattern ). '$#uD';
        //pre($preg_url); 
        return $preg_url;
    }


}

// тест полигон)
router::compile('/:news/:action/:id' , array( ':action' =>'[\w]+' )  ); 

//получаем строку вида 

#^/[^/.,;?\n]+/[\w]+/[^/.,;?\n]+d$#uD  

Где то что выделил жирным это кусок параметра :id
Подскажите в какой я регулярки ошибся


Автор: Fortop 22.8.2012, 09:04
Текущий код у меня выдал

Код

string(36) "#^/[^/.,;?\n]+/[\w]+/[^/.,;?\n]+$#uD"

Автор: Sanchezzz 22.8.2012, 10:02
Fortop, тестировал на win или linux ? и можно ещё версию узнать php.

Я тестировал на win7 сборка денвер php5.3
Сейчас перекину на сервер посмотрю как на linux это будет выглядить и  какой будет результат.



Автор: Sanchezzz 22.8.2012, 10:21
короче нашел ошибку это иза того что часть параметра совпадает 
/:controler/:action/:action2

Нужно замену в цикле подправить

Автор: Sanchezzz 24.8.2012, 06:23
Оставлю это тут может кому то пригодится рабочий вариант
Код


    /**
     * TODO Компиляция 
     * $url    /:controler/:action
     * $params array(':controler'=>'[\w]+')
     */
    public static function compile($url , $params ){
        preg_match_all(self::REGEX_KEY, $url ,$match);
        $condition_key = array_values($match[0]);
        
        $search = array();
        foreach ( array_keys($params) as $key ) {
            $search[] = '#:' . ltrim($key,':') . '\+?(?!\w)#';
        }
        $pattern = preg_replace($search, $params, $url );
        preg_replace('#\(/?:.+\)|\(|\)#', '', $pattern);
        foreach($condition_key as $key){
            $pattern = preg_replace('#'.$key.'\+?(?!\w)#u', self::REGEX_SEGMENT , $pattern  , 1);
        }

        return '#^'. $pattern . '$#uD';
    }


Вопрос решен, всем спасибо

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)