Recherche…


Analyse d'une URL

Pour séparer une URL dans ses composants individuels, utilisez parse_url() :

$url = 'http://www.example.com/page?foo=1&bar=baz#anchor';
$parts = parse_url($url);

Après avoir exécuté ce qui précède, le contenu de $parts serait:

Array
(
    [scheme] => http
    [host] => www.example.com
    [path] => /page
    [query] => foo=1&bar=baz
    [fragment] => anchor
)

Vous pouvez également renvoyer de manière sélective un seul composant de l'URL. Pour ne renvoyer que la chaîne de requête:

$url = 'http://www.example.com/page?foo=1&bar=baz#anchor';
$queryString = parse_url($url, PHP_URL_QUERY);

Les constantes suivantes sont acceptées: PHP_URL_SCHEME , PHP_URL_HOST , PHP_URL_PORT , PHP_URL_USER , PHP_URL_PASS , PHP_URL_PATH , PHP_URL_QUERY et PHP_URL_FRAGMENT .

Pour analyser davantage une chaîne de requête en paires de valeurs clés, utilisez parse_str() :

$params = [];
parse_str($queryString, $params);

Après l'exécution de ce qui précède, le tableau $params sera rempli avec les éléments suivants:

Array
(
    [foo] => 1
    [bar] => baz
)

Redirection vers une autre URL

Vous pouvez utiliser la fonction header() pour demander au navigateur de rediriger vers une URL différente:

$url = 'https://example.org/foo/bar';
if (!headers_sent()) { // check headers - you can not send headers if they already sent
  header('Location: ' . $url);
  exit; // protects from code being executed after redirect request
} else {
  throw new Exception('Cannot redirect, headers already sent');
}

Vous pouvez également rediriger vers une URL relative (cela ne fait pas partie de la spécification HTTP officielle, mais elle fonctionne dans tous les navigateurs):

$url = 'foo/bar';
if (!headers_sent()) {
  header('Location: ' . $url);
  exit;
} else {
  throw new Exception('Cannot redirect, headers already sent');
}

Si des en-têtes ont été envoyés, vous pouvez également envoyer une balise HTML de meta refresh .

AVERTISSEMENT: la balise meta refresh repose sur le traitement correct du HTML par le client, et certains ne le feront pas. En général, cela ne fonctionne que dans les navigateurs Web. Aussi, considérez que si des en-têtes ont été envoyés, vous pourriez avoir un bogue et cela devrait déclencher une exception.

Vous pouvez également imprimer un lien sur lequel les utilisateurs doivent cliquer, pour les clients qui ignorent la balise meta refresh:

$url = 'https://example.org/foo/bar';
if (!headers_sent()) {
  header('Location: ' . $url);
} else {
  $saveUrl = htmlspecialchars($url); // protects from browser seeing url as HTML
  // tells browser to redirect page to $saveUrl after 0 seconds
  print '<meta http-equiv="refresh" content="0; url=' . $saveUrl . '">';
  // shows link for user
  print '<p>Please continue to <a href="' . $saveUrl . '">' . $saveUrl . '</a></p>';
}
exit;

Construire une chaîne de requête encodée en URL à partir d'un tableau

http_build_query() créera une chaîne de requête à partir d'un tableau ou d'un objet. Ces chaînes peuvent être ajoutées à une URL pour créer une requête GET ou utilisées dans une requête POST avec, par exemple, cURL.

$parameters = array(
    'parameter1' => 'foo',
    'parameter2' => 'bar',
);
$queryString = http_build_query($parameters);

$queryString aura la valeur suivante:

parameter1=foo&parameter2=bar

http_build_query() fonctionnera également avec les tableaux multidimensionnels:

$parameters = array(
    "parameter3" => array(
        "sub1" => "foo",
        "sub2" => "bar",
    ),
    "parameter4" => "baz",
);
$queryString = http_build_query($parameters);

$queryString aura cette valeur:

parameter3%5Bsub1%5D=foo&parameter3%5Bsub2%5D=bar&parameter4=baz

qui est la version encodée en URL de

parameter3[sub1]=foo&parameter3[sub2]=bar&parameter4=baz


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow