Dans PHP, PARSE_URL est une fonction très pratique qui analyse l'URL et en extrait diverses parties, telles que le schéma, l'hôte, le chemin, etc. Cependant, dans l'exigence d'obtenir des noms de sous-domaine, PARSE_URL ne fournit pas directement le champ de "nom de sous-domaine", nous devons donc atteindre l'objectif avec l'aide de l'analyse supplémentaire de l'hôte . Cependant, il existe des fosses et des détails qui sont facilement négligées dans ce processus, nous en discuterons donc en détail ci-dessous.
PARSE_URL essaiera d'analyser la chaîne dans laquelle vous avez passé, même si ce n'est pas une URL standard. Par exemple:
$url = 'not-a-valid-url';
$parsed = parse_url($url);
print_r($parsed);
À l'heure actuelle, $ analysé ne peut retourner qu'une partie des informations, et même la structure est complètement non satisfaite comme prévu. Par conséquent, il est préférable de vérifier la légalité de l'URL avant d'utiliser PARSE_URL , ou du moins ajouter http: // préfixe:
if (!preg_match('#^https?://#', $url)) {
$url = 'http://' . $url;
}
PARSE_URL renverra l'hôte , mais ne vous donnera pas directement le nom de sous-domaine. Par exemple:
$url = 'https://sub.gitbox.net/path';
$parsed = parse_url($url);
echo $parsed['host']; // Sortir sub.gitbox.net
Nous devons diviser cet hôte par nous-mêmes. La pratique habituelle consiste à utiliser l'exploit :
$hostParts = explode('.', $parsed['host']);
Si le résultat est [«sub», «gitbox», «net»] , alors sub peut être considéré comme un sous-domaine. Mais ce n'est pas toujours exact, surtout dans les situations suivantes:
Certains pays ont des structures à deux couches telles que Co.uk et com.cn. Si nous traitons simplement les deux derniers champs comme le nom de domaine principal et le reste comme le sous-domaine, une erreur se produira. Par exemple:
$url = 'https://sub.example.co.uk';
$parsed = parse_url($url);
$hostParts = explode('.', $parsed['host']);
Le résultat est [«sub», «exemple», «co», «uk»] , à ce moment, l'exemple.co.uk est le domaine principal et le nom du sous-domaine est sub .
Pour résoudre ce problème, vous devez introduire une liste de suffixes publics (liste de suffixes publics), ou utiliser une bibliothèque tierce telle que Jeremykendall / PHP-Domain-Parser pour déterminer avec précision les limites entre le domaine principal et le sous-domaine.
Si l'URL utilise une adresse IP comme nom d'hôte, il n'y a naturellement aucun concept de "nom de sous-domaine":
$url = 'http://192.168.1.1';
$parsed = parse_url($url);
echo $parsed['host']; // Sortir 192.168.1.1
Les adresses IPv6 sont plus complexes, contenant même des supports:
$url = 'http://[2001:db8::1]';
$parsed = parse_url($url);
echo $parsed['host']; // Sortir [2001:db8::1]
Aucune de ces situations ne doit être traitée à tort comme des noms de domaine avec des sous-domaines.
Bien que PARSE_URL séparera le numéro de port:
$url = 'http://sub.gitbox.net:8080';
$parsed = parse_url($url);
Cependant, lors de l'extraction de noms de sous-domaines, nous ne devons prêter attention à l'hôte et ne pas être interféré par le numéro de port. Parfois, lorsque vous utilisez des noms de domaine d'extraction réguliers, vous allez accidentellement rassembler le port, ce qui entraîne une erreur de jugement.
L'utilisation de PARSE_URL pour extraire des sous-domaines n'est pas un problème unique, impliquant plusieurs situations limites. Nous recommandons:
Prétraitez l'URL avant utilisation pour assurer son format standard;
Après l'analyse, utilisez des méthodes fiables pour extraire le domaine et le sous-domaine principal;
Utilisez des listes de suffixes publics dans la mesure du possible pour identifier les limites de niveau supérieur et primaire;
Gestion spéciale des adresses IP et IPv6;
Faites attention aux facteurs d'interférence tels que le numéro de port, pas de préfixe de protocole, etc.
Ce n'est qu'en considérant ces détails de manière exhaustive que nous pouvons éviter de nous précipiter dans l'analyse d'URL et de construire un système plus robuste.