我正在试图阻止我的网址。我有一个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);
}
这种作品。
答案 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);