Php 清理一个URL,以便“删除”//&引用;被移除

Php 清理一个URL,以便“删除”//&引用;被移除,php,directory,backtracking,Php,Directory,Backtracking,是否有PHP方法处理用户输入的URL,而不是: 它变成 在保留查询参数等所有其他内容的同时 最好不使用正则表达式或字符串替换。如果可能的话,请提供更通用且不依赖操作系统的服务 编辑:为了添加一些上下文,我的脚本正在动态地构建上面的URL,这会导致我的网站上出现一个特定的脚本,我将生成的URL作为回调/重定向URL传递给Google+登录API,但Google不接受回调URL中的此类“非标准”字符。此代码段可以用PHP的方式实现这一点,如果没有正则表达式: $url = "http://www

是否有PHP方法处理用户输入的URL,而不是:

它变成

在保留查询参数等所有其他内容的同时

最好不使用正则表达式或字符串替换。如果可能的话,请提供更通用且不依赖操作系统的服务


编辑:为了添加一些上下文,我的脚本正在动态地构建上面的URL,这会导致我的网站上出现一个特定的脚本,我将生成的URL作为回调/重定向URL传递给Google+登录API,但Google不接受回调URL中的此类“非标准”字符。

此代码段可以用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);
}
需要调用数组_值来重新索引$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";
}

这两个URL不一定相等。web服务器可以自由地解释“.”。无论它希望以何种方式,它都不一定意味着“父目录”。@user1986811不是一个选项,因为我正在将URL传递给第三方服务,而不是重定向到它。第三方服务不接受包含“/…/”的“非标准”URL。请参阅编辑的问题以获得澄清。@deceze正确,但我将URL传递给的第三方服务不接受此类目录回溯。它需要一个干净的URL。请参阅已编辑的问题了解上下文。我的脚本正在动态构建上述URL,这表明您的脚本工作错误。它应该生成有效的URL。我所说的“脚本”是指“框架”(Yii)。不幸的是,我不能仅仅为了满足这个特定的目的而修改框架,而是需要对生成的URL进行后期处理。