web-dev-qa-db-ja.com

クエリ文字列を削除してURLのみを取得する方法は?

PHPを使用して現在のページのURLを作成しています。時々、次の形式のURL

www.mydomian.com/myurl.html?unwantedthngs

要求されます。 ?とそれに続くすべて(クエリ文字列)を削除して、結果のURLが次のようになるようにします。

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;
}
?>
177
Navi Gamage

strtokname__を使用して、最初に?が発生する前に文字列を取得できます。

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

PHP Manual-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;
}

?>

編集(2番目の完全な例):

スキームが添付され、通知メッセージが表示されないことを確認するために、関数が更新されました。

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
)

これは、2番目のパラメーターなしでparse_url()を介してサンプル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
63
veritas

最適なソリューション:

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

同じドメインにフォームを送信する場合、 http://domain.com を含める必要はありません。

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

最も簡単な方法

$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
6
Mukesh Saxena

ある行で変数に爆発し、次の行で連結することなくこのソリューションを実装するには、少なくとも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

6

リクエストパスを取得する場合( 詳細 ):

echo parse_url($_SERVER["REQUEST_URI"])['path']

クエリを削除する場合(および場合によってはフラグメントも):

function strposa($haystack, $needles=array(), $offset=0) {
        $chr = array();
        foreach($needles as $needle) {
                $res = strpos($haystack, $needle, $offset);
                if ($res !== false) $chr[$needle] = $res;
        }
        if(empty($chr)) return false;
        return min($chr);
}
$i = strposa($_SERVER["REQUEST_URI"], ['#', '?']);
echo strrpos($_SERVER["REQUEST_URI"], 0, $i);
2
user1079877

あなたが試すことができます:

<?php
$this_page = basename($_SERVER['REQUEST_URI']);
if (strpos($this_page, "?") !== false) $this_page = reset(explode("?", $this_page));
?>
1
ysrb

リクエストURIからクエリ文字列を削除するには、クエリ文字列を空の文字列に置き換えます。

function request_uri_without_query() {
    $result = $_SERVER['REQUEST_URI'];
    $query = $_SERVER['QUERY_STRING'];
    if(!empty($query)) {
        $result = str_replace('?' . $query, '', $result);
    }
    return $result;
}
1
Ryan Prechel

相対URLと絶対URLの両方を扱うため、以下のコードのようにveritasのソリューションを更新しました。
ここで自分で試すことができます: https://ideone.com/PvpZ4J

function removeQueryStringFromUrl($url) {
    if (substr($url,0,4) == "http") {
        $urlPartsArray = parse_url($url);
        $outputUrl = $urlPartsArray['scheme'] . '://' . $urlPartsArray['Host'] . ( isset($urlPartsArray['path']) ? $urlPartsArray['path'] : '' );
    } else {
        $URLexploded = explode("?", $url, 2);
        $outputUrl = $URLexploded[0];
    }
    return $outputUrl;
}
1
trante

php手動コメント に従って以下を使用することもできます

$_SERVER['REDIRECT_URL']

これは特定のPHP環境でのみ機能することに注意してください。詳細については、そのページの以下のコメントに従ってください。

目的:現在のPHPファイルのURLパス名。path-infoはN/Aであり、URLクエリ文字列は含まれません。先頭のスラッシュを含みます。

警告:これはURLが書き換えられる前です(つまり、元の呼び出しURLによる)。

警告:すべてのPHP環境で設定されているわけではなく、URLが書き換えられている環境でのみ設定されています。

Webモードで動作:はい

CLIモードで動作:いいえ

0

これを試して

$url_with_querystring = 'www.mydomian.com/myurl.html?unwantedthngs';
$url_data = parse_url($url_with_querystring);
$url_without_querystring = str_replace('?'.$url_data['query'], '', $url_with_querystring);
0
kwelsan

次のような関数でparse_urlビルドを使用できます。

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