2012-05-30 3 views
2

У меня есть код последующих, которые получают $_GET и сделать деление на контроллер, действие и PARAMSДружественные URL с ":"

http://localhost/controller/action/param1/param2 

$url = explode('/', $_GET['url']); 
$urlSize = count($url); 
$filter = $this->factory('Core\Security\Filter'); 

if($urlSize >= 1) { 
    $controller = $filter->replace($url[0], 'friendly-url'); 

    if($urlSize >= 2) { 
     $action = $filter->replace($url[1], 'friendly-url'); 

     if($urlSize >= 3) { 
      unset($url[0], $url[1]); 

      foreach($url as $index => $param) { 
       $params[] = $filter->replace($param, 'friendly-url'); 
      } 
     } 
    } 
} 

Core\Security\Filter->replace(), которые я разрабатываю сейчас:

public function replace($data = null, $type = 'alphanumeric') { 
    /* 
     @TODO, implement regex by type 

     numeric 
       $regex = '/^[[:digit:]]$/'; 
     alphanumeric 
       $regex = '/^[[:alnum:]]$/'; 
     friendly-url 
       $regex = '/[^a-zA-Z0-9_-]+/'; 
       $replace = '-' 
     username 
       $regex = '/^[^a-zA-Z0-9_-.]{3,32}+'; 
     email 
       $regex = '/^[[a-zA-Z0-9_-.]{1,96}][email protected][a-zA-Z0-9-]{2,64}+(?:\.[a-zA-Z0-9-]+)*$/'; 
    */ 
} 

Ok , проблема у меня есть: Как получить URL-адреса в этом формате:

http://localhost/controller/action/param1/param2:value2 

$ Парам массив:

Array(
    [0] => param1 
    [1] => Array(
     [param2] => value2 
    ) 
) 

РЕШИТЬ С ЭТИМ:

foreach($url as $index => $param) { 
    if(strstr($param, ':')) { 
     $subParam = explode(':', $param, 2); 
     $this->_request['params'][][$subParam[0]] = $filter->replace($subParam[1], 'friendly-url-param'); 
    } else { 
     $this->_request['params'][] = $filter->replace($param, 'friendly-url-param'); 
    } 
} 
+1

Довольно пожалуйста с сахаром на вершине использования 'filter_var ($ ул FILTER_VALIDATE_EMAIL) 'вместо регулярного выражения, которое не соответствует целой группе действительных ema il, тема, которая была [включена] (http://stackoverflow.com/questions/201323) [здесь] (http://stackoverflow.com/questions/1903356) [at] (http: // stackoverflow. com/questions/703060) [длина] (http://stackoverflow.com/questions/997078) – DaveRandom

+1

Будьте предупреждены: двоеточия в URI [запрещены в windows apache] (https://issues.apache.org/bugzilla/show_bug .cgi? ID = 41441). В результате лучше избегать двоеточий в URL-адресах в PHP-приложениях. –

+0

Одним из требований не являются серверы Windows;) –

ответ

2
<?php 

$url = 'http://localhost/controller/action/param1/param2:value2'; 

$parts = parse_url($url); 
$path = $parts['path']; 

list($controller, $action, $params) = explode('/', ltrim($path, '/'), 3); 

function parse_params($params) { 
    $parsed_params = array(); 
    $path_segments = explode('/', $params); 
    foreach ($path_segments as $path_segment) { 
     if (strstr($path_segment, ':')) { 
      list($k, $v) = explode(':', $path_segment, 2); 
      $parsed_params[] = array($k => $v); 
     } else { 
      $parsed_params[] = $path_segment; 
     } 
    } 
    return $parsed_params; 
} 



$params = parse_params($params); 

print_r($params); 

ВЫВОД

Array 
(
    [0] => param1 
    [1] => Array 
     (
      [param2] => value2 
     ) 

) 
+0

Возможно, REGEX не выполняет эту работу. Но я решил проблему с моим обновленным вопросом, основываясь на вашем ответе. Благодаря! –

Смежные вопросы