Эта функция решить на текущий URL страницы относительный адрес в дал в $pgurl
без регулярных выражений. Он успешно решает:
/home.php?example
типов,
же-Dir nextpage.php
типов,
типы
../...../.../parentdir
,
полного http://example.net
URLs,
и сокращенную //example.net
URLs
//Current base URL (you can dynamically retrieve from $_SERVER)
$pgurl = 'http://example.com/scripts/php/absurl.php';
function absurl($url) {
global $pgurl;
if(strpos($url,'://')) return $url; //already absolute
if(substr($url,0,2)=='//') return 'http:'.$url; //shorthand scheme
if($url[0]=='/') return parse_url($pgurl,PHP_URL_SCHEME).'://'.parse_url($pgurl,PHP_URL_HOST).$url; //just add domain
if(strpos($pgurl,'/',9)===false) $pgurl .= '/'; //add slash to domain if needed
return substr($pgurl,0,strrpos($pgurl,'/')+1).$url; //for relative links, gets current directory and appends new filename
}
function nodots($path) { //Resolve dot dot slashes, no regex!
$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% уверенным, просто увеличьте блок переключателей до поддержки 6 + точки, хотя я никогда не видел столько точек в URL-адресе).
Надеется, что это помогает,
Я не вижу, как вы могли бы определить эту клиентскую сторону ... хорошо, если мы не говорим о перенаправлении, а не переписывание. – ficuscr
Возможный дубликат [PHP: как разрешить относительный URL-адрес] (http://stackoverflow.com/questions/1243418/php-how-to-resolve-a-relative-url) – fusion3k