这个函数将解析相对于$pgurl
给定当前页面URL的相对URL,而无需使用正则表达式。它成功地解析了:
/home.php?example
类型的URL,
同一目录下的 nextpage.php
类型的URL,
../...../.../parentdir
类型的URL,
完整的 http://example.net
URL,
以及简写的 //example.net
URL。
$pgurl = 'http://example.com/scripts/php/absurl.php';
function absurl($url) {
global $pgurl;
if(strpos($url,'://')) return $url;
if(substr($url,0,2)=='//') return 'http:'.$url;
if($url[0]=='/') return parse_url($pgurl,PHP_URL_SCHEME).'://'.parse_url($pgurl,PHP_URL_HOST).$url;
if(strpos($pgurl,'/',9)===false) $pgurl .= '/';
return substr($pgurl,0,strrpos($pgurl,'/')+1).$url;
}
function nodots($path) {
$arr1 = explode('/',$path);
$arr2 = array();
foreach($arr1 as $seg) {
switch($seg) {
case '.':
break;
case '..':
array_pop($arr2);
break;
case '...':
array_pop($arr2); array_pop($arr2);
break;
case '....':
array_pop($arr2); array_pop($arr2); array_pop($arr2);
break;
case '.....':
array_pop($arr2); array_pop($arr2); array_pop($arr2); array_pop($arr2);
break;
default:
$arr2[] = $seg;
}
}
return implode('/',$arr2);
}
使用示例:
echo nodots(absurl('../index.html'));
nodots()
必须在 URL 转换为绝对路径之后调用。
点函数有点多余,但可读性高,速度快,不使用正则表达式,并且将解析 99% 的典型 URL(如果您想要 100% 确定,请扩展 switch 块以支持 6+ 个点,尽管我从未见过那么多点的 URL)。
希望这可以帮助到您,