是否有PHP方式处理用户输入网址而不是:
http://example.com/directory/../index.php
它变成了
同时保留其他所有内容,例如查询参数完好无损?
优选没有正则表达式或字符串替换。请尽可能通用,而不依赖操作系统。
编辑:要添加一些上下文,我的脚本会动态构建上面的网址,这会导致我网站上的特定脚本,并且我将生成的网址作为回调/重定向网址传递给Google+登录API,但Google不接受回调网址中的此类“非标准”字符。
答案 0 :(得分:0)
这个代码片段可以用PHP方式完成,没有正则表达式:
$url = "http://www.example.com/data/data2/data3/../../page.html";
$parts = explode("/",$url);
while ($index = array_search('..', $parts)) {
unset($parts[$index]);
unset($parts[$index-1]);
$parts = array_values($parts);
}
需要调用array_values来重新索引$ parts数组,以处理“..”出现多次的情况,如示例所示。
考虑到查询字符串包含子字符串“/../”的情况,可以将代码段改进为:
$url = "http://www.example.com/data/data2/data3/../../page.html?url=/../b";
$pieces = explode("?",$url);
$parts = explode("/",$pieces[0]);
while ($index = array_search('..', $parts)) {
unset($parts[$index]);
unset($parts[$index-1]);
$parts = array_values($parts);
}
if (count($pieces)>1) {
echo join("?",array(join("/",$parts),$pieces[1])) . "\n";
} else {
echo join("/",$parts) . "\n";
}