2012-05-30 162 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-]+)*$/'; 
    */ 
} 

好,我的问题是:如何获得这种格式的网址:

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)。因此,最好避免PHP应用程序中的URL冒号。 –

+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可能不会完成这项工作。但是,根据您的回答,我已经通过更新后的问题解决了我的问题。谢谢! –