me di cuenta de la respuesta upvoted anterior utiliza expresiones regulares, que puede ser peligroso cuando se trata de direcciones URL.
Esta función se resolverá URL relativos a una página actual url dada en $pgurl
sin expresiones regulares. Se resuelve con éxito:
/home.php?example
tipos,
mismos-dir nextpage.php
tipos,
../...../.../parentdir
tipos,
completos http://example.net
URLs,
y taquigrafía //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);
}
Ejemplo de uso:
echo nodots(absurl('../index.html'));
nodots()
debe ser llamado después de la URL se convierte en absoluto.
La función de puntos es algo redundante, pero es legible, rápida, no utiliza expresiones regulares, y resolverá el 99% de las URL típicas (si quiere estar 100% seguro, simplemente extienda el bloque de conmutadores para admitir 6 + puntos, aunque nunca he visto tantos puntos en una URL).
Espero que esto ayude,
Aquí es [una comparación] (http://scraperblog.blogspot.com/2012/12/convert- relative-urls-to-absolute-in.html) de algunas de las soluciones mencionadas más una mía propia. – pguardiario
Este código me funcionó: http://sourceforge.net/projects/absoluteurl/ –
dublicates: http://stackoverflow.com/questions/4444475/transfrom-relative-path-into-absolute-url-using -php http://stackoverflow.com/questions/11653677/php-relative-urls-to-absolute-urls-conversion-with-eventually-base-href-html-tag http://stackoverflow.com/questions/19618754/convert-relative-url-to-absolute-url http://stackoverflow.com/questions/26423904/converting-relative-url-to-absolute – qdinar