使用PHP解析URL中的相对路径

Jac*_*ruz 4 php url relative-path resolve

示例1:domain.com/dir_1/dir_2/dir_3/./../../../
应在浏览器中自然解析为=domain.com/

例2:domain.com/dir_1/dir_2/dir_3/./../../../test/././../new_dir/
应该解决domain.com/new_dir/

例3:domain.com/dir_1/dir_2/dir_3/./../../../test/dir4/../final
应该解决domain.com/test/final

问题是......我怎么能遍历字符串才能做到这一点?我觉得for()循环在这一点上会感到困惑.

使用PHP
PHP将相对路径转换为绝对URL
:如何解析相对URL

在这种情况下对我不起作用..我不应该需要一个参考点(基础),因为目标是清理我已经拥有的东西.

nic*_*ckb 9

这是一个更简单的问题,然后你正在考虑它.您需要做的只是explode()/角色上,并使用堆栈解析所有单个段.当您从左到右遍历数组时,如果看到.,则不执行任何操作.如果你看到..,从堆栈中弹出一个元素.否则,将元素推入堆栈.

$str = 'domain.com/dir_1/dir_2/dir_3/./../../../';
$array = explode( '/', $str);
$domain = array_shift( $array);

$parents = array();
foreach( $array as $dir) {
    switch( $dir) {
        case '.':
        // Don't need to do anything here
        break;
        case '..':
            array_pop( $parents);
        break;
        default:
            $parents[] = $dir;
        break;
    }
}

echo $domain . '/' . implode( '/', $parents);
Run Code Online (Sandbox Code Playgroud)

这将正确解析所有测试用例中的URL.

请注意,错误检查是作为练习留给用户的(即当$parents堆栈为空并且您尝试从其中弹出一些东西时).