[php] 쿼리 문자열을 제거하고 URL 만 얻는 방법?

현재 페이지의 URL을 빌드하기 위해 PHP를 사용하고 있습니다. 때로는 다음 형식의 URL

www.mydomian.com/myurl.html?unwantedthngs

요청됩니다. ?결과 URL이되도록 다음과 뒤에 오는 모든 항목 (querystring) 을 제거하고 싶습니다 .

www.mydomain.com/myurl.html

내 현재 코드는 다음과 같습니다

<?php
function curPageURL() {
    $pageURL = 'http';
    if ($_SERVER["HTTPS"] == "on") {
        $pageURL .= "s";
    }
    $pageURL .= "://";
    if ($_SERVER["SERVER_PORT"] != "80") {
        $pageURL .= $_SERVER["SERVER_NAME"] . ":" .
            $_SERVER["SERVER_PORT"] . $_SERVER["REQUEST_URI"];
    } else {
        $pageURL .= $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"];
    }
    return $pageURL;
}
?>



답변

strtok처음 발생하기 전에 문자열을 얻는 데 사용할 수 있습니다.?

$url = strtok($_SERVER["REQUEST_URI"], '?');

strtok()?쿼리 문자열에서 하위 문자열을 직접 추출하는 가장 간결한 기술을 나타냅니다 . explode()첫 번째 요소에 액세스해야하는 잠재적으로 2 요소 배열을 생성해야하기 때문에 덜 직접적입니다.

쿼리 문자열이 누락되거나 URL에서 다른 / 의도하지 않은 하위 문자열을 잠재적으로 변경하면 일부 다른 기술이 중단 될 수 있습니다. 이러한 기술은 피해야합니다.

데모 :

$urls = [
    'www.example.com/myurl.html?unwantedthngs#hastag',
    'www.example.com/myurl.html'
];

foreach ($urls as $url) {
    var_export(['strtok: ', strtok($url, '?')]);
    echo "\n";
    var_export(['strstr/true: ', strstr($url, '?', true)]); // not reliable
    echo "\n";
    var_export(['explode/2: ', explode('?', $url, 2)[0]]);  // limit allows func to stop searching after first encounter
    echo "\n";
    var_export(['substr/strrpos: ', substr($url, 0, strrpos( $url, "?"))]);  // not reliable; still not with strpos()
    echo "\n---\n";
}

산출:

array (
  0 => 'strtok: ',
  1 => 'www.example.com/myurl.html',
)
array (
  0 => 'strstr/true: ',
  1 => 'www.example.com/myurl.html',
)
array (
  0 => 'explode/2: ',
  1 => 'www.example.com/myurl.html',
)
array (
  0 => 'substr/strrpos: ',
  1 => 'www.example.com/myurl.html',
)
---
array (
  0 => 'strtok: ',
  1 => 'www.example.com/myurl.html',
)
array (
  0 => 'strstr/true: ',
  1 => false,                       // bad news
)
array (
  0 => 'explode/2: ',
  1 => 'www.example.com/myurl.html',
)
array (
  0 => 'substr/strrpos: ',
  1 => '',                          // bad news
)
---


답변

사용 PHP 설명서 – parse_url () 당신이 필요로하는 부품을 얻을 수 있습니다.

편집 (@Navi Gamage 사용 예)

다음과 같이 사용할 수 있습니다.

<?php
function reconstruct_url($url){    
    $url_parts = parse_url($url);
    $constructed_url = $url_parts['scheme'] . '://' . $url_parts['host'] . $url_parts['path'];

    return $constructed_url;
}

?>

편집 (두 번째 전체 예) :

구성표가 첨부되고 통지 메시지가 표시되지 않도록 기능이 업데이트되었습니다.

function reconstruct_url($url){    
    $url_parts = parse_url($url);
    $constructed_url = $url_parts['scheme'] . '://' . $url_parts['host'] . (isset($url_parts['path'])?$url_parts['path']:'');

    return $constructed_url;
}


$test = array(
    'http://www.mydomian.com/myurl.html?unwan=abc',
    'http://www.mydomian.com/myurl.html',
    'http://www.mydomian.com',
    'https://mydomian.com/myurl.html?unwan=abc&ab=1'
);

foreach($test as $url){
    print_r(parse_url($url));
}       

돌아올 것이다 :

Array
(
    [scheme] => http
    [host] => www.mydomian.com
    [path] => /myurl.html
    [query] => unwan=abc
)
Array
(
    [scheme] => http
    [host] => www.mydomian.com
    [path] => /myurl.html
)
Array
(
    [scheme] => http
    [host] => www.mydomian.com
)
Array
(
    [path] => mydomian.com/myurl.html
    [query] => unwan=abc&ab=1
)

이것은 두 번째 매개 변수없이 설명 URL을 parse_url ()을 통해 전달한 결과입니다.

그리고 이것은 다음을 사용하여 URL을 생성 한 후의 최종 결과입니다.

foreach($test as $url){
    echo reconstruct_url($url) . '<br/>';
}   

산출:

http://www.mydomian.com/myurl.html
http://www.mydomian.com/myurl.html
http://www.mydomian.com
https://mydomian.com/myurl.html


답변

최고의 솔루션 :

echo parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);

동일한 도메인에 양식을 제출하는 경우 http://domain.com 을 포함시킬 필요가 없습니다 .


답변

$val = substr( $url, 0, strrpos( $url, "?"));


답변

가장 쉬운 방법

$url = 'https://www.youtube.com/embed/ROipDjNYK4k?rel=0&autoplay=1';
$url_arr = parse_url($url);
$query = $url_arr['query'];
print $url = str_replace(array($query,'?'), '', $url);

//output
https://www.youtube.com/embed/ROipDjNYK4k


답변

한 줄에서 변수를 탐색하고 다음 줄에서 연결하지 않고이 솔루션을 구현하려면 최소한 PHP 버전 5.4가 필요하지만 쉬운 한 줄은 다음과 같습니다.

$_SERVER["HTTP_HOST"].explode('?', $_SERVER["REQUEST_URI"], 2)[0];

서버 변수 : http://php.net/manual/en/reserved.variables.server.php

배열 역 참조 : https://wiki.php.net/rfc/functionarraydereferencing


답변

다음과 같은 함수에서 parse_url 빌드를 사용할 수 있습니다.

$baseUrl = $_SERVER['SERVER_NAME'] . parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);