254 votes

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

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

www.example.com/myurl.html?unwantedthngs

sont demandés. Je souhaite supprimer le ? et tout ce qui suit (querystring), de sorte que l'URL résultante devienne :

www.example.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;
}
?>

8 votes

BTW, c'est ce qu'on appelle la "chaîne de requête".

722voto

RiaD Points 15744

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

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

strtok() représente la technique la plus concise pour extraire directement la sous-chaîne avant la chaîne de caractères ? dans la chaîne de requête. explode() est moins directe, car elle doit produire un tableau à deux éléments potentiels par lequel le premier élément doit être accédé.

D'autres techniques peuvent être interrompues lorsque la chaîne de requête est manquante ou peuvent muter d'autres sous-chaînes ou des sous-chaînes involontaires dans l'url -- ces techniques doivent être évitées.

A démonstration :

$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";
}

Sortie :

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

26 votes

+1 pour l'utilisation directe de $_SERVER au lieu de reconstruire l'url pour l'analyser à nouveau. je donnerais un autre +1 si possible, pour la concision.

0 votes

explode() renvoie la chaîne complète si le délimiteur n'est pas trouvé. PHP 5.4 $uri = explode($_SERVER["REQUEST_URI"],'?')[0]; PHP avant 5.4 array_shift(explode($_SERVER["REQUEST_URI"],'?'));

8 votes

Oups -- inversez ces arguments pour explode(), le délimiteur passe en premier. array_shift(explode('?',$_SERVER["REQUEST_URI"]))

77voto

veritas Points 1195

Utilisation Manuel de PHP - parse_url() pour obtenir les pièces dont vous avez besoin.

Modifier (exemple d'utilisation pour @Navi Gamage)

Vous pouvez l'utiliser comme suit :

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

    return $constructed_url;
}

?>

Modifier (deuxième exemple complet) :

Mise à jour de la fonction pour s'assurer que le schéma sera attaché et qu'aucun message de notification n'apparaîtra :

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.example.com/myurl.html?unwan=abc',
    `http://www.example.com/myurl.html`,
    `http://www.example.com`,
    `https://example.com/myurl.html?unwan=abc&ab=1`
);

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

Nous reviendrons :

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

Voici le résultat obtenu en faisant passer des exemples d'URL parse_url() sans second paramètre (à des fins d'explication uniquement).

Voici le résultat final après la construction de l'URL :

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

Sortie :

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

0 votes

Je l'ai lu, mais je suis un peu perdu car je ne connais pas php. Pouvez-vous m'aider avec le code php ci-dessus ?

0 votes

J'ai ajouté ce code après la ligne 9 $pageURL = substr( $pageURL, 0, strrpos( $pageURL, " ?")) ;

0 votes

Il efface la section des requêtes dans l'url...> www.mydomain.com/myurl.html?unwantedthings le résultat est correct ! > www.mydomian.com/myurl.html Fait... Mais quand il s'agit d'une url normale > www.mydomain.com/myurl.html le résultat n'est rien...Vide

72voto

Ludo DD Points 121

La meilleure solution :

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

Il n'est pas nécessaire d'inclure votre http://example.com dans votre <form action=""> si vous soumettez un formulaire au même domaine.

1 votes

Notez que parse_url s'attend à une URL absolue, vous obtiendrez donc des résultats incorrects dans certains cas, par exemple si votre REQUEST_URL commence par plusieurs barres obliques consécutives. Ceux-ci seront interprétés comme un URI relatif au protocole.

0 votes

@AndyLorenz avez-vous au moins essayé ? parce qu'il supprime effectivement la chaîne de requête.

0 votes

@Ludo-Offtherecord vous avez raison - j'ai supprimé mon commentaire. toutes mes excuses !

16voto

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

0 votes

Les gars, selon vos réponses, c'est fait... Merci pour votre aide... Cela efface la section des requêtes dans l'url...

0 votes

> www.mydomain.com/myurl.html?unwantedthings le résultat est OK ! > www.mydomian.com/myurl.html Fait... Mais lorsqu'il s'agit d'une url normale > www.mydomain.com/myurl.html le résultat est nul...Vide

0 votes

Nouveau code php code <?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"] ; $pageURL = substr( $pageURL, 0, strrpos( $pageURL, " ?")) ; } return $pageURL ; } ?> code

2voto

ysrb Points 5301

Vous pouvez essayer :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X