我希望有以下网址: -
URL 1 - www.projectname/module/search/param/1
URL 2 - www.projectname/param/1/module/search
我想要一个PHP代码,它将上述URL作为参数并返回一个类似
的数组Array("module" => "search", "param" => 1) (for URL 1)
Array("param" => 1, "module" => "search") (for URL 2)
这样我就可以在项目中将结果用作$ _GET。我开始知道使用PHP比使用htaccess重写规则更好更容易。如果您可以帮助重写规则,请帮助。
可以有任意数量的参数。
我从CodeIgniter的URL处理库中得到了这个想法。但我的项目不在Codeigniter上,所以我不能使用该库。任何独立的代码都可以做到吗?
提前致谢
答案 0 :(得分:5)
这是一项完成工作的功能。请注意,我已填写了网址,因为parse_url
需要该方案。它也会因严重格式错误的网址而失败。
function get_dispatch($url) {
// Split the URL into its constituent parts.
$parse = parse_url($url);
// Remove the leading forward slash, if there is one.
$path = ltrim($parse['path'], '/');
// Put each element into an array.
$elements = explode('/', $path);
// Create a new empty array.
$args = array();
// Loop through each pair of elements.
for( $i = 0; $i < count($elements); $i = $i + 2) {
$args[$elements[$i]] = $elements[$i + 1];
}
return $args;
}
print_r(get_dispatch('http://www.projectname.com/module/search/param/1'));
print_r(get_dispatch('http://www.projectname.com/param/1/module/search'));
结果如下:
Array
(
[module] => search
[param] => 1
)
Array
(
[param] => 1
[module] => search
)
然而,这可能不是很强大。如果有一个写得很好的库已经完成了工作(就像Itay Moav建议的那样),那么你一定要仔细研究它。
答案 1 :(得分:0)
使用PHP函数parse_url
http://php.net/manual/en/function.parse-url.php
$url = 'http://username:password@hostname/path?arg=value#anchor';
print_r(parse_url($url));
Array
(
[scheme] => http
[host] => hostname
[user] => username
[pass] => password
[path] => /path
[query] => arg=value
[fragment] => anchor
)
然后,您可以分析数组的path
部分。
你冷,然后使用explode
将项目放入一个关联数组?
答案 2 :(得分:0)
使用php explode功能。您必须解析结果并查看$ result 1是否是您应用程序中的有效模块,依此类推。解析器的逻辑应该属于您的应用程序。有人提到的Zend_router通过尝试映射到现有的模块/控制器/动作,无论它具有什么$ request对象,都会做同样的事情。
$result = explode('/', $string);
答案 3 :(得分:0)
$url = parse_url('http://www.projectname.com/module/search/param/1');
$params = explode('/', trim($url['path'], '/'));
$params = array_chunk($params, 2); //tricky part here
foreach($params as $param)
{
$final_params[$param[0]] = $param[1];
}
编辑:parse_url仅使用正确的网址
array_chunk是一项很好的功能:)