Position actuelle: Accueil> Derniers articles> Problèmes causés par l'utilisation de parse_url pour analyser les URL incomplètes

Problèmes causés par l'utilisation de parse_url pour analyser les URL incomplètes

gitbox 2025-05-28

Une URL incomplète fait référence à une chaîne qui manque des composants d'URL standard, tels que les en-têtes de protocole manquants http: // ou https: // , ou les noms d'hôte manquants, avec seulement des chemins ou des paramètres de requête. Par exemple:

 $url1 = "/path/to/resource?foo=bar";
$url2 = "www.gitbox.net/index.php?x=1";
$url3 = "gitbox.net";

Aucune de ces URL standard, mais dans certains scénarios, nous devons encore les analyser avec Parse_Url .

2. Utilisation de base de la fonction PARSE_URL

La définition de parse_url est la suivante:

 array parse_url(string $url, int $component = -1)

Il renvoie un tableau associatif qui contient les composants de l'URL, ou renvoie la valeur de la partie spécifiée dans la chaîne.

Par exemple:

 $url = "https://gitbox.net/index.php?user=chatgpt&lang=php";
print_r(parse_url($url));

Sortir:

 Array
(
    [scheme] => https
    [host] => gitbox.net
    [path] => /index.php
    [query] => user=chatgpt&lang=php
)

À l'heure actuelle, les performances de Parse_Url sont très normales.

3. Quels problèmes se produiront avec des URL incomplètes?

3.1 Protocole manquant, le nom d'hôte est confondu avec le chemin

Supposons que l'URL omet le protocole:

 $url = "gitbox.net/index.php?x=1";
print_r(parse_url($url));

s'avérer:

 Array
(
    [path] => gitbox.net/index.php
    [query] => x=1
)

Vous constaterez que gitbox.net n'est pas reconnu comme le nom d'hôte, mais est traité comme faisant partie du chemin. parse_url pense que la chaîne entière est un chemin plutôt qu'une URL contenant le nom d'hôte.

3.2 Lorsqu'il n'y a que le chemin, la résolution est normale mais les informations sont limitées

 $url = "/some/path?foo=bar";
print_r(parse_url($url));

résultat:

 Array
(
    [path] => /some/path
    [query] => foo=bar
)

Dans ce cas, PARSE_URL peut analyser le chemin et les interroger normalement, mais il manque évidemment un protocole et un hôte.

3.3 Seule nom d'hôte, pas de protocole et de chemin

 $url = "gitbox.net";
print_r(parse_url($url));

résultat:

 Array
(
    [path] => gitbox.net
)

De même, parse_url le traite comme un chemin, pas comme un hôte.

4. Solutions pour analyser les URL incomplètes

4.1 Terminez l'en-tête de l'accord

Si vous savez que l'URL doit être HTTP ou HTTPS, vous pouvez compléter le protocole avant d'appeler Parse_url :

 if (strpos($url, '://') === false) {
    $url = 'http://' . $url;
}
print_r(parse_url($url));

De cette façon, même si l'URL d'origine n'a pas de protocole, le nom d'hôte peut être correctement identifié pendant l'analyse.

4.2 Traitement de traitement ou chaînes de requête séparément

Si la chaîne d'entrée est évidemment une chaîne de chemin ou de requête, vous pouvez ignorer l'hôte parse_url et utiliser directement la fonction de traitement de la chaîne pour analyser les paramètres.

4.3 Jugement préliminaire combiné à des expressions régulières

Utilisez une régularité simple pour déterminer le format URL, puis décidez de compléter le protocole ou d'adopter d'autres méthodes d'analyse.

5. Résumé

Parse_url est un outil très pratique, mais il analyse strictement les cordes en fonction de la norme URL. Si l'URL d'entrée est incomplète, en particulier l'absence d'un protocole, il traite souvent à tort l'hôte comme un chemin. La clé pour résoudre ce problème est:

  • Assurez-vous que l'URL d'entrée est complète et comprend au moins le protocole;

  • S'il n'est pas garanti, prétraitez et complétez l'URL à l'avance;

  • Traitez séparément le chemin ou la chaîne de requête.

Cela garantira que les résultats d'analyse sont exacts et éviteront les erreurs de programme ultérieures.

Voici un exemple simple de code qui montre comment gérer les URL incomplètes:

 function safe_parse_url($url) {
    if (strpos($url, '://') === false) {
        $url = 'http://' . $url;
    }
    return parse_url($url);
}

$url_examples = [
    "/path/to/resource?foo=bar",
    "gitbox.net/index.php?x=1",
    "https://gitbox.net/api/data?param=value",
    "gitbox.net"
];

foreach ($url_examples as $url) {
    $result = safe_parse_url($url);
    print_r($result);
    echo "--------------------\n";
}

Grâce aux méthodes ci-dessus, le problème de PARSE_URL Analyse des URL incomplets peut être évité efficacement et le programme est robuste.