高级URL参数

时间:2012-06-13 16:58:08

标签: php mod-rewrite url-rewriting

我正在试图阻止我的网址。我有一个mod_rewrite,用'.php?slug = [some + text]'结束文件,并替换为'/ [some + text]'。但是,这不会使您在URL中存储多个变量而不会让它看起来很乱。

我曾尝试编写一个带有网址的PHP脚本:

.php?slug=search/this+is+a+search/tags/php+sql/page/2

应该用

替换它
array(
   'search'->'this is a search',
   'tags'->'php sql',
   'page'->2
);

我已经走到了这一步。

if(isset($_GET['slug'])&&$_GET['slug']!=''){
$url=$_GET['slug'];
$params=explode(DIRECTORY_SEPARATOR,$url);
print_r($params);
}

返回:

Array ( 
  [0] => search
  [1] => this is a search
  [2] => tags 
  [3] => php sql 
  [4] => page 
  [5] => 2 
) 

如何将其转换为顶部的数组?有更好的方法吗?

我在玩耍之后找到的一种方式是:

if(isset($_GET['slug'])&&$_GET['slug']!=''){
    $url=$_GET['slug'];
    $params=explode(DIRECTORY_SEPARATOR,$url);
    $out=array();
    $array_size = count($params);
    for($i = 0; $i < $array_size; $i+=2)
    {
        $key=$params[$i];
        $value=$params[$i+1];
        $out[$key]=$value;
    }
    print_r($out);

}

这种作品。

3 个答案:

答案 0 :(得分:1)

我可能会使用.htaccess文件完成所有工作。

RewriteRule    ^([A-Za-z0-9]+)/?$    index.php?search=$1    [QSA]
RewriteRule    ^([A-Za-z0-9]+)/([A-Za-z0-9]+)/?$    index.php?search=$1&tags=$2    [QSA]
RewriteRule    ^([A-Za-z0-9]+)/([A-Za-z0-9]+)/([0-9]+)/?$    index.php?search=$1&tags=$2&page=$3    [QSA]

然后你要做的就是像这样访问每一个:

<?php
$search = $_GET['search'];
$tags = $_GET['tags'];
$page = $_GET['page'];
?>

注意:[QSA]意味着在整齐的后面你仍然可以使用凌乱的url变量。如果你想传递一个布尔值或者一个id,但是不介意它看起来很乱,这很方便。

我知道这不是你问的问题,但你可能会发现这种方式更容易。

答案 1 :(得分:1)

这样做:

$params = array_combine(array_map(function($a) {return $a[0];},$tmp = array_chunk($params,2)),array_map(function($a) {return $a[1];},$tmp));

一衬垫!

请注意,您实际上并未实现任何目标。比较:

somefile.php?search=some+text&tags=php+sel&page=2
somefile/search/some+text/tags/php+sel/page/2

除了删除扩展程序外,您还没有获得任何收益。你只需要解析一个复杂的字符串就会让自己变得更难。

答案 2 :(得分:0)

您可以使用数组键的第一个值来破坏/上的字符串。

//$url = $_SERVER['REQUEST_URI'];
//$url = $_GET['slug'];
$url = 'search/this+is+a+search/tags/php+sql/page/2';

preg_match_all('~([^/]+)/([^/]+)~', $url, $matches, PREG_SET_ORDER);

$values = array();
foreach($matches as $match)
{
    $values[$match[1]] = $match[2];
}

print_r($values);