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.
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.
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é.
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);
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.
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
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:
Utilisez PARSE_URL pour déchirer l'URL;
Utilisez PARSE_STR pour séparer la pièce de requête;
Utiliser le codage d' UrLencode pour chaque valeur de paramètre;
Reconstruire la requête en utilisant http_build_query ;
É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.