web-dev-qa-db-fra.com

Comment supprimer la chaîne de requête et obtenir uniquement l'URL?

J'utilise PHP pour construire l'URL de la page en cours. Parfois, les URL sous la forme de

www.mydomian.com/myurl.html?unwantedthngs

sont demandés. Je veux supprimer le ? et tout ce qui le suit (chaîne de requête), de sorte que l'URL résultante devienne:

www.mydomain.com/myurl.html

Mon code actuel est le suivant:

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

Vous pouvez utiliser strtok pour obtenir une chaîne avant la première occurrence de ?

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

Utilisez PHP Manual - parse_url () pour obtenir les composants dont vous avez besoin.

Edit (exemple d'utilisation de @Navi Gamage)

Vous pouvez l'utiliser comme ceci:

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

    return $constructed_url;
}

?>

Edit (deuxième exemple complet):

Fonction mise à jour pour s'assurer que le schéma sera attaché et qu'aucun message d'erreur ne s'affiche:

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));
}       

Reviendra:

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
)

Il s'agit du résultat obtenu en transmettant des exemples d'URL à parse_url () sans deuxième paramètre (pour une explication uniquement).

Et ceci est la sortie finale après la construction de l'URL en utilisant:

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

Sortie:

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

meilleure solution:

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

Pas besoin d'inclure votre http://domain.com dans votre si vous soumettez un formulaire au même domaine.

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

moyen le plus simple

$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

Vous aurez besoin d'au moins PHP Version 5.4 pour implémenter cette solution sans exploser en une variable sur une ligne ni en concaténer sur la suivante, mais un liner simple serait:

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

Variables du serveur: http://php.net/manual/en/reserved.variables.server.php
Array Dereferencing: https://wiki.php.net/rfc/functionarraydereferencing

6
James Bordine II

Si vous voulez obtenir le chemin de la requête ( plus d'infos ):

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

Si vous souhaitez supprimer la requête et (et peut-être fragmenter également):

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

Tu peux essayer:

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

Pour supprimer la chaîne de requête de l'URI de la demande, remplacez la chaîne de requête par une chaîne vide:

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

Étant donné que je traite à la fois des URL relatives et absolues, j'ai mis à jour la solution de veritas, à l'instar du code ci-dessous.
Vous pouvez vous essayer ici: 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

pourrait également utiliser ce qui suit selon le commentaire du manuel php

$_SERVER['REDIRECT_URL']

Veuillez noter que cela ne fonctionne que pour certains PHP environnements et suivez le commentaire ci-dessous à partir de cette page pour plus d'informations;

Objectif: Le nom de chemin de l'URL du fichier PHP actuel, info-chemin est N/A et exclut la chaîne de requête d'URL. Inclut la barre oblique.

Mise en garde: Ceci est avant les réécritures d’URL (c’est-à-dire selon l’URL d’appel d’origine).

Mise en garde: Pas défini sur tous les environnements PHP, et uniquement sur ceux avec des réécritures d'URL.

Fonctionne en mode web: oui

Fonctionne en mode CLI: Non

0
Janith Chinthana

Essaye ça

$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

Vous pouvez utiliser la fonction de construction parse_url comme ceci:

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