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
在这种情况下对我不起作用..我不应该需要一个参考点(基础),因为目标是清理我已经拥有的东西.
这是一个更简单的问题,然后你正在考虑它.您需要做的只是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堆栈为空并且您尝试从其中弹出一些东西时).