Position actuelle: Accueil> Derniers articles> Corriger le traitement du codage avec parse_url et urlencode

Corriger le traitement du codage avec parse_url et urlencode

gitbox 2025-05-26

Dans le développement quotidien, les développeurs doivent souvent traiter les URL contenant des paramètres chinois. Étant donné que les caractères chinois ne peuvent pas être utilisés directement dans l'URL, ils doivent être codés, sinon cela peut entraîner des erreurs d'analyse ou des défaillances de demande. PHP fournit plusieurs fonctions liées à l'URL, où PARSE_URL est utilisée pour analyser les URL, et URLencode est utilisé pour coder les chaînes de codage d'URL. Comment combiner correctement ces deux fonctions est devenue la clé pour traiter les paramètres chinois.

Cet article utilisera un exemple pour expliquer comment utiliser PARSE_URL et URLENCODOD pour traiter correctement les URL contenant des paramètres chinois.

1. Problème Contexte

Supposons que nous ayons une URL:

 https://gitbox.net/search?q=test&lang=zh

Les paramètres de requête de cette URL contiennent le "test" chinois. Si nous transmettons cette URL directement à certaines interfaces, la reconnaissance peut échouer en raison de la non-codage. Si vous utilisez UrleNcode pour coder toute l'URL entière, cela entraînera une confusion structurelle, tels que des colons, des barres obliques, des points d'interrogation, etc., qui sont également incorrectement codés.

Nous devons donc coder exactement la "valeur", pas l'URL entière.

2. Utilisez PARSE_URL pour décomposer les URL

Tout d'abord, nous utilisons parse_url pour décomposer les différents composants de l'URL:

 $url = 'https://gitbox.net/search?q=test&lang=zh';
$parsed = parse_url($url);

print_r($parsed);

Le résultat de sortie est le suivant:

 Array
(
    [scheme] => https
    [host] => gitbox.net
    [path] => /search
    [query] => q=test&lang=zh
)

Grâce à ce résultat d'analyse, nous pouvons obtenir la chaîne de requête d'origine, mais notez que la requête ici est un formulaire original non transformé.

3. Extraire et traiter les paramètres de requête

Nous pouvons utiliser PARSE_STR pour convertir la partie de requête en un tableau associatif, puis coder la valeur:

 parse_str($parsed['query'], $queryParams);

foreach ($queryParams as $key => $value) {
    $queryParams[$key] = urlencode($value);
}

Désormais, chaque valeur dans $ QueryParams est correctement codée dans un format sécurisé URL.

Ensuite, nous devons recouvrir ces paramètres dans une chaîne de requête:

 $encodedQuery = http_build_query($queryParams);

Cela génère la chaîne suivante:

 q=%E6%B5%8B%E8%AF%95&lang=zh

Remarque: Lors de l'encodage de la valeur http_build_query , par défaut, convertit l'espace en un signe plus ( + ). Si vous voulez que l'espace soit représenté par % 20 , vous pouvez ajouter un deuxième paramètre:

 $encodedQuery = http_build_query($queryParams, '', '&', PHP_QUERY_RFC3986);

4. épisser l'URL complète

Enfin, nous reposons les pièces traitées dans une URL complète:

 $finalUrl = $parsed['scheme'] . '://' . $parsed['host'] . $parsed['path'] . '?' . $encodedQuery;

echo $finalUrl;

Le résultat de la sortie est:

 https://gitbox.net/search?q=%E6%B5%8B%E8%AF%95&lang=zh

Les paramètres chinois de cette URL sont désormais codés en toute sécurité et conviennent à tout navigateur ou bibliothèque de requêtes HTTP.

5. encapsulé en fonctions

Pour plus de commodité de réutilisation, la logique ci-dessus peut être encapsulée en fonction:

 function encodeUrlQuery($url) {
    $parsed = parse_url($url);
    if (!isset($parsed['query'])) {
        return $url;
    }

    parse_str($parsed['query'], $queryParams);

    foreach ($queryParams as $key => $value) {
        $queryParams[$key] = urlencode($value);
    }

    $encodedQuery = http_build_query($queryParams, '', '&', PHP_QUERY_RFC3986);

    $result = $parsed['scheme'] . '://' . $parsed['host'];
    if (isset($parsed['path'])) {
        $result .= $parsed['path'];
    }
    $result .= '?' . $encodedQuery;

    return $result;
}

Comment utiliser:

 $url = 'https://gitbox.net/search?q=test&lang=zh';
echo encodeUrlQuery($url);

Sortir:

 https://gitbox.net/search?q=%E6%B5%8B%E8%AF%95&lang=zh

6. Résumé

Lors du traitement des URL contenant des paramètres chinois en PHP, vous ne pouvez pas utiliser URLencode directement pour toute l'URL, mais devrait:

  1. Utilisez PARSE_URL pour déchirer l'URL;

  2. Utilisez PARSE_STR pour séparer la pièce de requête;

  3. Utiliser le codage d' UrLencode pour chaque valeur de paramètre;

  4. Reconstruire la requête en utilisant http_build_query ;

  5. Épissé dans une URL complète.

Cette méthode conserve non seulement la structure de l'URL, mais assure également le codage correct des paramètres, évitant les problèmes causés par les caractères chinois.