2014-10-17 3 views
3

문서의 URL을 다른 문서 (절대적이거나 상대적 일 수 있음)에 연결하고이 링크를 절대적으로 사용해야한다고 가정 해 봅시다.상대 URL을 절대 주소로 변환

function absolute_url($url,$parent_url){ 
    $parent_url=parse_url($parent_url); 
    if(strcmp(substr($url,0,7),'http://')==0){ 
    return $url; 
    } 
    elseif(strcmp(substr($url,0,1),'/')==0){ 
    return $parent_url['scheme']."://".$parent_url['host'].$url; 
    } 
    else{ 
    $path=$parent_url['path']; 
    $path=substr($path,0,strrpos($path,'/')); 
    return $parent_url['scheme']."://".$parent_url['host']."$path/".$url; 
    } 
} 

$parent_url='http://example.com/path/to/file/name.php?abc=abc'; 
echo absolute_url('name2.php',$parent_url)."\n"; 
// output http://example.com/path/to/file/name2.php 
echo absolute_url('/name2.php',$parent_url)."\n"; 
// output http://example.com/name2.php 
echo absolute_url('http://name2.php',$parent_url)."\n"; 
// output http://name2.php 

코드는 잘 작동하지만 이러한 작동하지 않습니다 ../../path/to/file.php로 더 경우가있을 수 있습니다 :

나는 몇 가지 일반적인 경우에이 기능을 제공하는 간단한 기능을했다.

그래서 표준 함수 나 함수가 내 함수보다 잘 (더 보편적으로) 그렇게합니까?

나는 Google에 비슷한 질문 (onetwo)을 시도했지만 찾고있는 것이 아닌 서버 경로 관련 솔루션처럼 보입니다.

+0

'.. \ .. \ 경로 \는 파일 경로, URL이 아니라, 그래서 별도의 기능을 보증한다. – Steve

+0

@Steve 그래서 'file'는 HTML 문서에서 작동하지 않습니까? –

+0

브라우저에 따라 다를 수 있지만이를 보장하지는 않습니다. uri (링크에 넣는 내용)에는 슬래시를 사용해야합니다. 나는 어색하게하려고하지 않고, 파일 경로에 대해 이야기하는 곳을 생각했습니다. 예를 들어 phps와 함께 사용하는 경우 등이 있습니다. – Steve

답변

0
$uri = ".."; 
$path = realpath($uri); 
$root = realpath($_SERVER["DOCUMENT_ROOT"]); 

if($path){ 
    $path = str_replace($root, "", $path); 
    $path = $_SERVER["SERVER_NAME"] . $path; 
    $protocol = "http"; 
    if(isset($_SERVER["HTTPS"])){ 
     $protocol .= "s";   
    } 
    $path = "{$protocol}://$path"; 
    $path = str_replace("\\", "/", $path); 
} 

var_dump($path); 

가 더 나은/빠른 방법은 아마도,하지만 난 그냥이를 기절 ...

+0

이 함수는 로컬에서만 작동한다는 것을 알고 있으므로 원격 파일에 대해 작동하는 함수가 필요합니다. 권리? –

+0

예 ...나는 안다, 미안하다 :) –

0

이 기능은 정규식없이 $pgurl주어진 현재 페이지의 URL에 상대 URL를 해결합니다. 그것은 성공적으로 해결합니다

/home.php?example 유형,

같은-DIR nextpage.php 유형,

../...../.../parentdir 유형,

전체 http://example.net URL을,

및 속기 //example.net URL을

//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); 
} 
01 23,516,

사용 예는 :

echo nodots(absurl('../index.html')); 

nodots()이 URL은 절대로 변환됩니다 후 를 호출해야합니다.

도트 기능은 일종의 중복이지만 읽기 쉽고 빠르며 정규 표현식을 사용하지 않으며 일반 URL의 99 %를 해결합니다 (100 % 확신하려면 그냥 6을 지원하도록 스위치 블록을 확장하십시오). + 점들, 나는 URL에서 그 점들을 본 적이 없지만). file.php`을 \이 도움이

희망,

+0

그것을 테스트하지 않았지만 내가 필요한 것을 정확하게 본다. –

관련 문제