PHP: Comment parser une URL
Comment obtenir les éléments d'une URL, et les paramètres éventuellement associés?
Deux cas peuvent se présenter: soit l'URL est dans une chaîne de caractère et on veut en retrouver les éléments, soit il s'agit d'un script Web lancé pour traiter les données d'une formulaire par la méthode POST, dont on veut récupérer les données.
1) Utilisation de la fonction parse_url
Pour parser une URL dans une chaîne, deux fonctions seront utiles, parse_url et parse_str. La première décompose une URL en éléments comme Location en JavaScript, la seconde décompose une chaîne de paramètres en variable et valeurs.Comparaison avec JavaScript
La fonction parse_url à pour équivalent l'objet Location en JavaScript. Les clés du tableau associatif sont remplacées par les propriétés de l'objet Location.
L'URL complète s'obtient avec la constante __FILE__ qui est globale et n'appartient pas au tableau généré par parse_url.
Données |
PHP
|
JavaScript
|
URL complète |
__FILE__
|
location.href
|
Protocole (http) |
scheme
|
protocol
|
Domaine |
host
|
hostname
|
Répertoire et fichier |
path
|
pathname
|
Ancre dans la page |
fragment
|
hash
|
Paramètres |
query
|
search
|
Port |
-
|
port
|
Login |
user
|
-
|
Mot de passe |
pass
|
-
|
Autres différences:
- Si l'on ajoute à la fois une ancre interne et des paramètres, ce qui n'est pas correct, l'ensemble sera associé à hash en JavaScript et à query en PHP.
- En JavaScript le protocole inclut les deux points, comme dans http: mais pas en PHP.
Utilisation de la fonction parse_url
Exemple:
$url = "https://www.scriptol.fr/comment/parser-url.php#content";
$arr = parse_url($url)
print_r($arr);
On obtient un tableau associatif où les clés sont détaillées dans le tableau précédent.
array(
"scheme" => http,
"host" => www.scriptol.fr,
"path" => /comment/parser-url.php,
"fragment" => content
)
Utilisation de la fonction parse_str
Exemple:
$parameters = $arr["query"];
parse_str($parameters, $data);
print_r($data);
$data est un tableau associatif, ou les clés sont les variables passées en paramètres, et les valeurs, le contenu de ces variables.
Par exemple:
fichier.php?nom=untel&numero=50
Le tableau généré sera:
array(
"nom" => untel,
"numero" => 50
)
Sources et téléchargement
- Code source du script en ligne.
- Code source du script local.
- Archive contenant les sources et une page de démonstration.
2) Utilisation de la variable $_SERVER
Cette seconde partie montre comment obtenir les mêmes informations avec la variable prédéfinie $_SERVER et notamment obtenir les données d'un formulaire à passer à un script PHP.
Comparaison avec parse_url
Les données concernant le script ou la page PHP sont obtenues avec la variable prédéfinie $_SERVER et une liste de clés correspondant aux informations cherchées, qui sont données dans le tableau ci-dessous.
Précisons que le nom de domaine est donné directement par l'utilisateur. Dans notre example, c'est www.example.com.
Données | parse_url |
Clés pour $_SERVER |
URL complète | __FILE__ |
domaine + REQUEST_URI |
Protocole | scheme |
SERVER_PROTOCOL |
Domaine | host |
constante utilisateur |
Répertoire et fichier | path |
SCRIPT_NAME |
Ancre dans la page | fragment |
- |
Paramètres | query |
QUERY_STRING |
Port | - |
- |
Login | user |
Traité séparément |
Mot de passe | pass |
Traité séparément |
Différences:
- La fonction parse_url fournit le nom générique du protocol tandis que la variable système inclut la version, sous par exemple la forme HTTP/1.1.
Utilisation de la variable prédéfinie
Exemple:
$protocol = $_SERVER[SERVER_PROTOCOL];
La liste des clés est fournie dans la manuel PHP à la rubrique: "variables prédéfinies".
Récupérer les données d'un formulaire HTML
Exemple:
$parameters = $_SERVER[QUERY_STRING];
parse_str($parameters, $data);
print_r($data);
$data est un tableau associatif, ou les clés sont les variables passées en paramètres, et les valeurs, le contenu de ces variables.
Voir la première partie de l'article pour plus de détails.