1

我正在尝试整理我的网址。我有一个 mod_rewrite 可以找到以 '.php?slug=[some+text]' 结尾的文件并替换为 '/[some+text]'。然而,这并不能让您在一个 url 中存储多个变量而不会使它看起来很乱。

我试图编写一个 php 脚本,它的 url 看起来像:

.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);

}

这类作品。

4

3 回答 3

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 变量之后拥有凌乱的 url 变量。如果您想传递一个布尔值或一个 id 但不介意它是否看起来很乱,这很方便。

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

于 2012-06-13T17:05:49.643 回答
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

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

于 2012-06-13T17:13:30.340 回答
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);
于 2012-06-13T17:17:15.227 回答