2016-04-06 7 views
-1

Это для веб-искателя на PHP. В принципе, учитывая базовый URL-адрес и относительную ссылку, мне нужно вернуть фактический/абсолютный URL-адрес результирующей ссылки.PHP - преобразование относительных ссылок на абсолютные URL

Пример: Базовый URL: http://www.somewebsite.com/files/page.html Ссылка: ../index.php

Результат: http://somewebsite.com/index.php

Есть библиотека, которая делает это, или способ кодировать его вручную?

+0

Я не вижу, как вы могли бы определить эту клиентскую сторону ... хорошо, если мы не говорим о перенаправлении, а не переписывание. – ficuscr

+0

Возможный дубликат [PHP: как разрешить относительный URL-адрес] (http://stackoverflow.com/questions/1243418/php-how-to-resolve-a-relative-url) – fusion3k

ответ

2

Эта функция решить на текущий 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-адресе).

Надеется, что это помогает,

Смежные вопросы